get请求乱码
当get请求出现乱码,只需要到tomcat的conf目录下修改server.xml文件,在配置端口号的地方,设置端口号后加上,空格
URIEnconding="UTF-8"
post请求乱码
在web.xml文件中注册CharacterEncodingFilter过滤器【Spring自带的】,通过CharacterEncodingFilter过滤器设置请求和响应参数编码格式。
在CharacterEncodingFilter源码【一部分】中:
private String encoding; private boolean forceRequestEncoding; private boolean forceResponseEncoding; public CharacterEncodingFilter() { this.forceRequestEncoding = false; this.forceResponseEncoding = false; }
然后在具体处理过滤请求的方法【doFilterInternal】中,可以看见在设置了encoding后就会将请求编码格式设置为你设置的请求编码格式。
在下面的判断中可以发现,当设置了请求参数后,第一个判断的判断条件中,它是或判断,第一个条件默认是false,并没有对他修改,所以他是false ;第二个条件也没有设置,他的值为true,最后结果为true,这样就把请求编码格式改为UTF-8。
第二个判断,只有一个条件,就是得你自己在filter的初始化参数中定义【forceResponseEncoding】的值,当定义后,响应的编码格式就会变成你设置的格式。
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String encoding = this.getEncoding(); if (encoding != null) { if (this.isForceRequestEncoding() || request.getCharacterEncoding() == null) { request.setCharacterEncoding(encoding); } if (this.isForceResponseEncoding()) { response.setCharacterEncoding(encoding); } } filterChain.doFilter(request, response); }
设置如下:
<!--设置请求编码和相应编码解决post请求的乱码问题--> <!--使用CharacterEncodingFilter解决乱码问题,服务器启动时先初始化监听器在初始化过滤器,所以这个过滤器设置在哪里都不会影响他的初始化--> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <!--设置请求编码,通过设置filter初始化参数,告诉CharacterEncodingFilter类修改请求编码--> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <!--设置响应编码,通过设置forceResponseEncoding的值告诉CharacterEncodingFilter类修改相应编码--> <init-param> <param-name>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <!--过滤的请求是全部请求,所以是 /* --> <url-pattern>/*</url-pattern> </filter-mapping>