web项目中排查乱码的经历

问题:想要从JSP页面跳转到另外一个JSP页面,而不经过后台Controller,但是跳转之后,页面是乱码的,开始想到了JSP页面的编码设置问题,但是没解决问题, 

后来看了最后面的两篇文章之后,解决了问题;

笼统的总结:一般的前端页面request请求数据,要经过后端的Controller设置编码,并返回response,这样就不会有乱码问题,但是这里前端直接跳转,由于没有设置编码,所以,

编码会出问题。

详细的总结:一个完整的前端请求到后端响应过程中所涉及到的编码:

第一,由于JSP页面本身就是在HTML静态框架中加入了Java代码的页面,最后再编译成.class文件(即本身还是一个servlet),所以JSP本身就有两个地方涉及到编码的地方:

JSP页面本身的编码:

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" %>

HTML页面的编码(包含在HTML的<head>标签中):

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

第二,页面的内容准备好之后,就要将内容提交到服务器;如果项目是运行在Tomcat中的,那么接下来的流程为:

请求数据(包括get请求,post请求,以及ajax请求)->  拦截器Interceptor ->  过滤器Filter   ->  Servlet处理业务数据;

所以这里Tomcat也参与一次编码的设置(该设置是在Tomcat的安装目录下的server.xml文件中):

<Connector executor="tomcatThreadPool"
        port="8080" protocol="HTTP/1.1"
        connectionTimeout="20000"
        redirectPort="8443"
        URIEncoding="UTF-8" />

其中URIEncoding主要是针对get请求而言的,URI就是指网页域名后的参数部分,所以其编码就是针对get参数设置的。

因此,也不会影响到post请求的编码。至于ajax中的请求方式,可以自定义。

下一个是拦截器,没有拦截器就进入了过滤器,在SprignMVC有关于编码的设置:

<filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <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>

这里是一个过滤器。在web.xml中设置了一系列的过滤器,其执行顺序就是按照先后的顺序执行的,

所以为了设置编码,会把编码过滤器放在前面。

这里涉及到的encoding,就是为了设置request的编码,forceEncoding是表示是否同时设置response的编码,默认是false。

======================到此为止,我的问题解决了,下面是新学到的东西,mark=====================

最后,是ajax乱码的问题;

在SpringMVC中某个controller上加上@ResponseBody标签,SpringMVC就可以自动返回字符串,json等格式的数据,并返回到浏览器,

这里需要设置的是:

@RequestMapping(value = "test.html",produces = "application/json;charset=utf-8")

produces属性,表示响应编码,该方法只能解决一个controller中的额编码问题。

总体配置:

<mvc:annotation-driven>  
    <mvc:message-converters>  
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>  
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">  
            <property name="supportedMediaTypes">  
                <list>  
                    <value>text/plain;charset=utf-8</value>  
                    <value>text/html;charset=UTF-8</value>  
                </list>  
            </property>  
        </bean>  
    </mvc:message-converters>  
</mvc:annotation-driven>

参考鸣谢:

1. https://www.lagou.com/lgeduarticle/16507.html -------》“SpringMvc中转发的html文件中文是乱码”

2. https://my.oschina.net/u/3551926/blog/1600136  -------》“SpringMVC下会碰到的乱码问题”

原文地址:https://www.cnblogs.com/Archie2018/p/13637964.html