使用新的 Spring UriComponentsBuilder 进行 URL 编码

2024-03-19

我正在尝试使用 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();

不幸的是,虽然scope参数中的空格被成功替换为“+”,但redirect_uri参数根本没有进行url编码。

E.g,

redirect_uri=https://oauth2-login-demo.appspot.com/code

应该结束了

redirect_uri=https%3A%2F%2Foauth2-login-demo.appspot.com%2Fcode

但未受影响。深入研究代码,特别是 org.springframework.web.util.HierarchicalUriComponents.Type.QUERY_PARAM.isAllowed(c) :

if ('=' == c || '+' == c || '&' == c) {
  return false;
}
else {
  return isPchar(c) || '/' == c || '?' == c;
}

显然允许“:”和“/”字符,但根据口香糖,它不应该允许。它一定是在进行某种其他类型的编码,尽管对于我来说,我无法想象是什么。我是不是找错了树?

Thanks


UriComponentsBuilder正在按照以下方式对您的 URI 进行编码RFC 3986 https://www.rfc-editor.org/rfc/rfc3986#section-3.4,特别值得注意的是第 3.4 节有关 URI 的“查询”组件的内容。

在“查询”组件中,字符/ and :是允许的,不需要转义。

采取/字符例如:“查询”组件(由未转义的字符明确分隔?和(可选)#字符),没有层次结构,并且/字符没有特殊含义。所以不需要编码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用新的 Spring UriComponentsBuilder 进行 URL 编码 的相关文章

随机推荐