Spring乱码问题解决方案

来源:互联网 发布:go开头的软件 编辑:程序博客网 时间:2024/05/16 18:09

请求乱码

GET请求乱码:

原因:请求参数带在url地址上、url地址什么时候解析?
tomcat收到请求对url进行编解码(ISO8859-1)
解决方案:在tomcat的8080端口配置出加上 URIEncoding="utf-8";
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

POST请求乱码:

 原因:请求参数是带在请求体
 请求体的解码是在第一次获取参数的时候
 filter可以用来解决乱码
 request.setCharacterEncoding("utf-8")
 

 响应乱码

 response.setContentType("text/html;charset=utf-8")
 
 1、tomcat一安装;上手就给server.xml中的8080处加上URIEncoding="utf-8"
 2、给项目里面再搞一个filter让他来解决所有的post乱码;
 3、SpringMVC自带的一个乱码解决的filter
项目的web.xml中配置:
<!--字符编码的filter一定要放在最前面  -->    <filter>        <filter-name>CharacterEncodingFilter</filter-name>        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>        <!-- 配置encoding,告诉我们指定的编码格式 -->        <init-param>            <param-name>encoding</param-name>            <param-value>utf-8</param-value>        </init-param>        <!-- 解决响应乱码 -->        <init-param>            <param-name>forceEncoding</param-name>            <param-value>true</param-value>        </init-param>    </filter>    <filter-mapping>        <filter-name>CharacterEncodingFilter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>        <!-- 支持rest的filter -->    <filter>        <filter-name>HiddenHttpMethodFilter</filter-name>        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>    </filter>    <filter-mapping>        <filter-name>HiddenHttpMethodFilter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>
在配置里面配置了encoding和forceEncoding
来看看CharacterEncodingFilter的源码,通过request.setCharacterEncoding(this.encoding)和response.setCharacterEncoding(this.encoding)来解决post请求和响应乱码的问题:
public class CharacterEncodingFilter extends OncePerRequestFilter {    private String encoding;    private boolean forceEncoding = false;    public void setEncoding(String encoding) {        this.encoding = encoding;    }    public void setForceEncoding(boolean forceEncoding) {        this.forceEncoding = forceEncoding;    }    @Override    protected void doFilterInternal(            HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)            throws ServletException, IOException {        //encoding是UTF-8        //forceEncoding位true        if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {            request.setCharacterEncoding(this.encoding);            if (this.forceEncoding) {                response.setCharacterEncoding(this.encoding);            }        }        filterChain.doFilter(request, response);    }}