1. GET请求乱码
1.1. 终极解决方案:修改server.xml的URIEncoding
如果使用tomcat插件,在<configuration>标签中设置<uriEncoding>属性即可1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
<!-- 设置uriEncoding -->
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
如果是tomcat服务器,则修改conf/server.xml
1 | <!-- 找到设置port="8080"的那个标签,添加URIEncoding="UTF-8"即可 --> |
2. POST请求乱码
2.1. 方式1:原生API
1 | ("/test") |
2.2. 方式2:CharacterEncodingFilter
使用原生API,每一个POST方法都要写一遍request.setCharacterEncoding("UTF-8"),太麻烦。干脆统一写一个Filter,所有的请求先统一执行一遍该方法,保证编码能被解析。
这个Filter不用我们亲自写,SpringMVC内置了CharacterEncodingFilter,这个过滤器不仅能设置POST请求的编码,还能设置响应的编码
1 | <filter> |
3. CharacterEncodingFilter的设置顺序最好放在首位
CharacterEncodingFilter会设置POST请求的编码1
request.setCharacterEncoding(encoding)
设置POST请求的编码,这条语句应该要写在获取参数之前,这样才能保证读取的参数编码格式是正确的1
2
3
4// 先设置编码
request.setCharacterEncoding(encoding)
// 再获取参数
request.getParameter("username");
有的过滤器,如HiddenHttpMethodFilter,查看源码可知有通过request.getParameter()获取参数。如果HiddenHttpMethodFilter配置顺序在CharacterEncodingFilter之前,就会出现先获取参数,再设置POST请求编码的情况。所以为了避免这种情况发生,在web.xml中,CharacterEncodingFilter应该配置在其它Filter之前
4. CharacterEncodingFilter源码分析
1 | public class CharacterEncodingFilter extends OncePerRequestFilter { |