最近项目中出现一个问题,就是前段调后端接口,参数带+号,传到后端后+号自动URLDecode成空格了。
1.问题排查
条件:tomcat配置server.xml有URIEncoding="UTF-8"
1.1get请求、post请求(参数跟在URL的后面),request.getParameter("token")中token会被自动URLDecode。而request.getQueryString()获得的值则是浏览器传的原值。
如果有中文,浏览器会自动转义,谷歌浏览器在view source上可以看到浏览器往后端传之前的参数值。
1.2post请求(参数在body里面),request.getQueryString()值为空, request.getParameter("token")中token不会被自动URLDecode,而且中文乱码。
加上
request.setCharacterEncoding("UTF-8");
后,中文不乱码,但是token也不会自动URLDecode。
1.3去掉tomcat配置的URIEncoding="UTF-8",在1.1情况下token参数也会被自动URLDecode,此时采用tomcat默认的编码方式。
2.深入tomcat解析
3.临时解决方案
1.如果发现+号编码了,那么解码一下
2.如果发现uss有空格,说明+号被URLDecode成空格,那么URLEncode一下就变成原来的值
// 1.如果发现+号编码了,那么解码一下
if (uss.contains("%2b") || uss.contains("%2B")) {
uss = URLDecoder.decode(uss, "UTF-8");
}
// 2.如果发现uss有空格,说明+号被URLDecode成空格,那么URLEncode一下就变成原来的值
if (uss.contains(" ")) {
uss = URLEncoder.encode(uss, "UTF-8");
}
参考博客:
https://blog.csdn.net/vickyway/article/details/46375971
https://muchstudy.com/2017/12/06/%E5%AD%97%E7%AC%A6%E8%A7%A3%E7%A0%81%E6%97%B6%E5%8A%A0%E5%8F%B7%E8%A7%A3%E7%A0%81%E4%B8%BA%E7%A9%BA%E6%A0%BC%E9%97%AE%E9%A2%98%E6%8E%A2%E7%A9%B6/