tomcat自动URLDecode解码问题(+号变空格)

最近项目中出现一个问题,就是前段调后端接口,参数带+号,传到后端后+号自动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/字符解码时加号解码为空格问题探究/

posted @ 2018-08-15 19:58  展云  阅读(5773)  评论(0编辑  收藏  举报