在使用Tomcat(其他Servlet容器没做过尝试,不清楚会不会出现这种情况) 做java web开发时,前端页面对于要传的参数要调用两次encodeURIComponent()函数进行编码。而在服务端只需要调用一次URLDecoder.decode()方法。具体的原因来看一下:
- 调用一次encodeURIComponent()
参数原始值 encodeURIComponent()编码之后 request.getParameter()读到的值 URLDecoder.decode()返回的结果 abcd abcd abcd abcd 中 %e4%b8%ad %e4%b8%ad 中 %ae%ca%aa %25ae%25ca%25aa %ae%ca%aa �ʪ
调用两次encodeURIComponent()
参数原始值 | encodeURIComponent()编码之后 | 再次encodeURIComponent()编码之后 | request.getParameter()读到的值 | URLDecoder.decode()返回的结果 |
abcd | abcd | abcd | abcd | abcd |
中 | %e4%b8%ad | %25e4%25b8%25ad | %e4%b8%ad | 中 |
%ae%ca%aa | %25ae%25ca%25aa | %2525ae%2525ca%2525aa | %25ae%25ca%25aa | %ae%ca%aa |
通过比较斜体的两列可以知道:
对于带有%25的url,tomcat在到达servlet之前会进行一次解码,由于只有带%的URL经过encodeURIComponent()之后会有%25,所以会导致包含%的参数值,被多一次解码,从而导致乱码。
由此:
页面两次encodeURIComponent()可以同时防止中文和带有%的参数值传到后台乱码。