• 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下会碰到的乱码问题”

  • 相关阅读:
    ASP.NET(4):多语言的解决方案
    无题
    SIP 计时器的总结(转)
    一个Sip协议栈的实现方案
    通过拦截WCF消息进行身份栈传播
    从WPF控件拖放到Winform控件的注意事项
    一个用C#操作OpenLDAP的例子
    通过定制行为拦截WCF消息
    一个基于Prism的方案的介绍
    MVVM模式下附加属性的使用
  • 原文地址:https://www.cnblogs.com/Archie2018/p/13637964.html
Copyright © 2020-2023  润新知