java - 令牌编码/解码问题 - 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");
问题如下:有时它可以正常工作,我可以通过令牌找到用户,但有时我会出错,因为解码的令牌无效,并且看起来与令牌不同。问题是什么?这很奇怪,因为有时有效,有时无效
解决方案
@RequestParam
由于注释,您的令牌已经被 Spring 解码。如果令牌包含 a +
,则第二次解码将替换为+
a (空白)。
我假设您正在使用java.net.URLEncoder
and java.net.URLDecoder
?正如encode(String, String)
and方法的 Javadoc 所描述的,它们对格式decode(String, String)
进行编码和解码。application/x-www-form-urlencoded
在这种格式中,+
是替换空格的特殊字符。
所以 a+
将被编码并解码为。因为 Spring 已经处理了解码,所以将再次进行。您的第二次解码将其转换为 a并且令牌将不再匹配。%2B
%2B
+
推荐阅读
- java - 在 logback 中更改 LoggingEvent 的级别
- linux-kernel - 中断控制器的linux驱动程序:字符或平台
- java - How to get keys of a LinkedHashMap sorted by their entry’s value?
- jquery - 尝试查看数据表时,$(...).DataTable 不是函数错误
- javascript - Mongodb + spring,spring实现deleteOne
- ansible - 在树莓派上进行 ansible Ping 测试
- c++ - C++ 将宏视为一个类
- python - Gunicorn ImportError:无法从 docker 中的“eventlet.wsgi”导入名称“ALREADY_HANDLED”
- node.js - 节点 JS,验证码解决
- terraform - terraform flatten loop 3次