我在使用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");
问题如下: 有时它可以正常工作,并且我能够按令牌查找用户,但是有时我会出错,因为解码的令牌无效,并且看起来与令牌不同。问题是什么?这很奇怪,因为有时它能起作用,有时却不起作用
答案 0 :(得分:1)
由于@RequestParam
批注,您的令牌将已经被Spring解码。
如果令牌包含+
,则第二次解码会将+
替换为(空白)。
我假设您正在使用java.net.URLEncoder
和java.net.URLDecoder
?正如encode(String, String)
和decode(String, String)
方法的Javadoc所描述的,它们对application/x-www-form-urlencoded
格式进行编码和解码。在此格式中,+
是替换空格的特殊字符。
因此,+
将被 en 编码为%2B
,而 de 将被编码为。因为Spring已经做好了解码工作,所以
%2B
将再次成为+
。您的第二次解码会将其转换为,令牌将不再匹配。