GET、POST编码问题

3 篇文章 0 订阅

GET请求、POST经常会出现中文乱码的问题,最好约定前后端的编码,一般为UTF-8。但是这里面也是有坑的。


后端设置编码为UTF-8的推荐方式:


SpringMVC配置过滤器:

<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>

此配置可以将请求体的内容按照UTF-8编码解码。


Tomcat的server.xml配置:

<Connector port="8080" protocol="HTTP/1.1"
               maxThreads="200" connectionTimeout="20000"
               enableLookups="false" compression="on"
               redirectPort="8443"
               URIEncoding="UTF-8"
 
               compressableMimeType="text/html,text/xml,text/plain,text/javascript,application/json"
/>

URIEncoding可以配置url中的编码,防止get请求参数中文乱码。这里还可以加一个参数,useBodyEncodingForURI。useBodyEncodingForURI=true时,代表url中请求参数的编码方式要采用请求体的编码方式。


这两个都配上,基本上就可以保证从前端传来的utf-8编码的请求到后端不会乱码了。


这里的一个坑是,对于Tomcat来说,URIEncoding就是针对url中的请求参数的编码设置的,而代码中的request.setCharacterEncoding('UTF-8')或者http报文请求头中的content-type中的编码都是针对请求体的。所以说如果只配了SpringMVC的过滤器却没有配置server.xml,就很可能会出现get请求中文乱码的问题。


配上SpringMVC的编码过滤器后,server.xml中的URIEncoding和useBodyEncodingForURI可以任选一种或者两个都配上,保证不会出现中文乱码。

事实上Tomcat8.0之后server.xml中的默认URIEncoding就是UTF-8。官方文档中建议使用第一种URIEncoding的方式。第二种配置方式主要为了兼容 Tomcat 4.1.x之前的版本。


题外话,可以看一下Spring的CharacterEncodingFilter实现:

@Override
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);
}

可以看出,是通过setCharacterEncoding解决编码问题的,其作用与设置Content-Type等效。因此只能解决请求体的编码。


参考文章

https://blog.csdn.net/x_iya/article/details/78636733

http://www.cnblogs.com/panxuejun/p/6837677.html

https://blog.csdn.net/hqfhello/article/details/51496955

https://www.cnblogs.com/yoyotl/p/5390876.html




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值