服务器端和浏览器交互乱码问题

请求中乱码一般分为request和response,现在按照网上的资料结合自己的理解进行总结(基于spring+tomcat)

浏览器编码格式可以参考这篇文章,戳这里

  • POST

1.手动添加

在需要设置编码的地方手动添加:

request.setCharacterEncoding("UTF-8")

2.在配置文件中添加(调用spring提供的CharacterEncodingFilter)

    <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>  
过滤器源码如下:
protected void doFilterInternal(  
      HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)  
      throws ServletException, IOException {  
  
   if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {  
      request.setCharacterEncoding(this.encoding);  
      if (this.forceEncoding) {  
         response.setCharacterEncoding(this.encoding);  
      }  
   }  
   filterChain.doFilter(request, response);  
}  
通过源码我们可以知道参数 forceEncoding设置为true表示:
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
  • GET

造成乱码的原因:在GET请求中对于url中的中文参数,浏览器(IE除外)会自动对中文进行urlencode转换成16进制编码,而服务器(tomcat)会默认用ISO-8859-1进行解码,这时候浏览器的格式是UTF-8,而服务器的格式却是ISO-8859-1,字符集不同,因此造成了乱码。

1.通过对服务器(tomcat)的配置文件进行修改

由于GET请求不允许我们通过编写代码的方式来设置解码方式,可以通过修改服务器(tomcat)中的配置文件来改变服务器默认的编码格式,具体操作如下:

找到conf下的server.xml文件下的
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 在该标签中增加URIEncoding="UTF-8"(这是把默认的ISO-8859-1改成了UTF-8)

2.对数据进行反编码

第一个方法有一个很明显的缺点就是只能在自己的服务器上生效,如果项目移交给别人或者在其他环境部署的时候也要修改配置文件,这就让人很不爽了而且容易出现纰漏。

所以我们可以通过反编码的方式,把乱码的数据用ISO-8859-1重新编码后再用UTF-8进行解码,操作如下:

扫描二维码关注公众号,回复: 1576854 查看本文章
String msg = request.getParameter("msg");  
msg = new String(msg.getBytes("ISO-8859-1"),"UTF-8");

猜你喜欢

转载自blog.csdn.net/zhutiandashen/article/details/80620751
今日推荐