UriComponentsBuilder / UriComponents编码的行为不正确

时间:2014-08-13 09:51:38

标签: java spring url spring-mvc

我有以下代码(包org.springframework.web.util)

UriComponentsBuilder.fromUriString("/test/").queryParam("rt","http://a.com?u=1").build(false).encode().toUriString()

实际结果: /测试/?RT = http://a.com?u%3D1

我的期望是: /test/?rt=http%3a%2f%2fa.com%3fu%3d1

任何想法?

1 个答案:

答案 0 :(得分:0)

根据我的理解,UriComponentsBuilder不会自动编码查询参数,只会对其实例化的原始HttpUrl进行编码。换句话说,您仍然必须明确编码:

UriComponentsBuilder根据RFC 3986对您的URI进行编码(请参阅http://www.ietf.org/rfc/rfc3986.txt,特别是第3.4节,其中包含URI的“查询”组件)。

query组件中,允许使用字符'/' and ':',并且不需要转义。

'/'字符为例:query组件(由未转义的'?'和(可选)'#'字符明确分隔),不是分层的'/'字符没有特殊含义。所以它不需要编码。

UriComponentsBuilder.fromUriString("/test/").queryParam("rt",URLEncoder.encode("http://a.com?u=1", "UTF-8")).build(false).encode().toUriString();

输出:/test/?rt=http%253A%252F%252Fa.com%253Fu%253D1