首页 > 解决方案 > 令牌编码/解码问题 - Spring

问题描述

我在使用 UrlEncoder 和 UrlDecoder 时遇到问题。

它看起来像这样: 令牌示例:

3vv3XIvofg3KIoMjLwU07329C6dsk8HJceuDT2F5jOwox2hyqAnL+03TPej/lW4TCeFWRadRkPKgW0aGxq+9B1VZLMvoevyFfaVXhvzIyLF8AN3NDCqk0hoqb51wlGtb4hUvOYKq5b63wuW2pfssr9O0dgCEK4VZz8QZ4jRpxZw=

我在我的 Spring 应用程序中为 Customer 设置了令牌。然后我对令牌进行编码以在 url 中使用它:

String token = // generated by mechanism
String encodedToken = UrlEncoder.encode(token, "UTF-8");

String url = "https://myapp.url?token=" + encodedToken;

我收到令牌作为@RequestParam。然后通过 UrlDecoder 对 token 进行解码

String decodedToken = UrlDecoder.decode(token, "UTF-8");

问题如下:有时它可以正常工作,我可以通过令牌找到用户,但有时我会出错,因为解码的令牌无效,并且看起来与令牌不同。问题是什么?这很奇怪,因为有时有效,有时无效

标签: javaspring

解决方案


@RequestParam由于注释,您的令牌已经被 Spring 解码。如果令牌包含 a +,则第二次解码将替换为+a (空白)。

我假设您正在使用java.net.URLEncoderand java.net.URLDecoder?正如encode(String, String)and方法的 Javadoc 所描述的,它们对格式decode(String, String)进行编码和解码。application/x-www-form-urlencoded在这种格式中,+是替换空格的特殊字符。
所以 a+将被编码解码为。因为 Spring 已经处理了解码,所以将再次进行。您的第二次解码将其转换为 a并且令牌将不再匹配。%2B%2B+


推荐阅读