我正在尝试使用spring的UriComponentsBuilder来生成一些用于oauth交互的URL.查询参数包括诸如回调URL和其中包含空格的参数值之类的实体.
试图使用UriComponentBuilder(因为现在不推荐使用UriUtils)
UriComponentsBuilder urlBuilder = UriComponentsBuilder.fromHttpUrl(oauthURL);
urlBuilder.queryParam("client_id", clientId);
urlBuilder.queryParam("redirect_uri", redirectURI);
urlBuilder.queryParam("scope", "test1 test2");
String url = urlBuilder.build(false).encode().toUriString();
Run Code Online (Sandbox Code Playgroud)
不幸的是,虽然scope参数中的空格已成功替换为'+',但redirect_uri参数根本不是url编码的.
例如,
redirect_uri=https://oauth2-login-demo.appspot.com/code
Run Code Online (Sandbox Code Playgroud)
应该结束了
redirect_uri=https%3A%2F%2Foauth2-login-demo.appspot.com%2Fcode
Run Code Online (Sandbox Code Playgroud)
但没有动过.潜入代码,特别是org.springframework.web.util.HierarchicalUriComponents.Type.QUERY_PARAM.isAllowed(c):
if ('=' == c || '+' == c || '&' == c) {
return false;
}
else {
return isPchar(c) || '/' == c || '?' == c;
}
Run Code Online (Sandbox Code Playgroud)
明确地允许':'和'/'字符,这不应该是口香糖.它必须做一些其他类型的编码,虽然对于我的生活,我无法想象什么.我在这里吠叫错了树吗?
谢谢
sim*_*onh 21
UriComponentsBuilder根据RFC 3986编码您的URI ,第3.4节关于URI的'query'组件是特别注意的.
在'query'组件中,允许使用字符'/'和':',并且不需要转义.
以'/'字符为例:'query'组件(由未转义的'?'和(可选)'#'字符明确分隔),不是分层的,'/'字符没有特殊含义.所以它不需要编码.
Bla*_*ack 15
根据我的理解,UriComponentsBuilder不会自动编码查询参数,只是它实例化的原始HttpUrl.换句话说,您仍然需要显式编码:
String redirectURI= "https://oauth2-login-demo.appspot.com/code";
urlBuilder.queryParam("redirect_uri", URLEncoder.encode(redirectURI,"UTF-8" ));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
46219 次 |
| 最近记录: |