令牌编码/解码问题-Spring

时间:2019-09-24 19:36:42

标签: java spring

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

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

3vv3XIvofg3KIoMjLwU07329C6dsk8HJceuDT2F5jOwox2hyqAnL+03TPej/lW4TCeFWRadRkPKgW0aGxq+9B1VZLMvoevyFfaVXhvzIyLF8AN3NDCqk0hoqb51wlGtb4hUvOYKq5b63wuW2pfssr9O0dgCEK4VZz8QZ4jRpxZw=

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

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

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

我收到令牌作为@RequestParam。然后令牌由UrlDecoder解码

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

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

1 个答案:

答案 0 :(得分:1)

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

我假设您正在使用java.net.URLEncoderjava.net.URLDecoder?正如encode(String, String)decode(String, String)方法的Javadoc所描述的,它们对application/x-www-form-urlencoded格式进行编码和解码。在此格式中,+是替换空格的特殊字符。
因此,+将被 en 编码为%2B,而 de 将被编码为。因为Spring已经做好了解码工作,所以%2B将再次成为+。您的第二次解码会将其转换为,令牌将不再匹配。