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

本文详细介绍了如何解决HTTP请求中的乱码问题,包括POST和GET请求,并提供了在Spring框架和Tomcat服务器环境下具体的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

请求中乱码一般分为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进行解码,操作如下:

String msg = request.getParameter("msg");  
msg = new String(msg.getBytes("ISO-8859-1"),"UTF-8");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值