最近項目中出現一個問題,就是前段調后端接口,參數帶+號,傳到后端后+號自動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/字符解碼時加號解碼為空格問題探究/
