【发布时间】:2014-02-21 07:21:16
【问题描述】:
如何强制URIBuilder.path(...)对"%AD"等参数进行编码?
URIBuilder 的方法 path、replacePath 和 segment 并不总是正确地用百分比编码参数。
当参数包含字符“%”后跟两个字符共同构成 URL 编码字符时,“%”不编码为“%25”。
例如
URI uri = UriBuilder.fromUri("https://dummy.com").queryParam("param", "%AD");
String test = uri.build().toString();
“测试”是“https://dummy.com?param=%AD”
但应该是“https://dummy.com?param=%25AD”(字符“%”编码为“%25”)
当“%”后面的两个字符是十六进制时,方法UriBuilderImpl.queryParam(...) 的行为如下所示。即,“com.sun.jersey.api.uri.UriComponent.isHexCharacter(char)”方法对“%”后面的字符返回 true。
我认为 UriBuilderImpl 的行为是正确的,因为我猜它试图不对已经编码的参数进行编码。但在我的场景中,我永远不会尝试使用已经编码的参数创建 URL。
我该怎么办?
我的 Web 应用程序使用 Jersey,并且在许多地方我使用 UriBuilder 类构建 URI 或调用 UriInfo 对象的方法 getBaseUriBuilder。
每次调用queryParam、replaceQueryParam 或segment 方法时,我都可以将“%”替换为“%25”。但我正在寻找一个不那么繁琐的解决方案。
如何让 Jersey 返回我自己的 UriBuilder 实现?
我想创建一个扩展 UriBuilderImpl 的类,它覆盖这些方法并在调用 super.queryParam(...) 或其他任何东西之前执行此替换。
在调用UriBuilder.fromURL(...)、UriInfo.getBaseUriBuilder(...) 等时,有什么方法可以让 Jersey 返回我自己的 UriBuilder 而不是 UriBuilderImpl?
看RuntimeDelegate的方法,想到了扩展RuntimeDelegateImpl。我的实现将覆盖方法createUriBuilder(...),这将返回我自己的UriBuilder,而不是UriBuilderImpl。
然后,我将添加文件META-INF/services/javax.ws.rs.ext.RuntimeDelegate,并在其中添加我的RuntimeDelegateImpl 的完整类名。
问题是 jersey-bundle.jar 已经包含一个指向com.sun.jersey.server.impl.provider.RuntimeDelegateImpl 的META-INF/services/javax.ws.rs.ext.RuntimeDelegate,因此容器加载该文件而不是我的javax.ws.rs.ext.RuntimeDelegate。因此,它不会加载我的RuntimeDelegateimplementation。
是否可以提供我自己的RuntimeDelegate 实现?
我应该采取不同的方法吗?
【问题讨论】:
标签: jersey jax-rs jersey-1.0