欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

springmvc字符编码过滤器CharacterEncodingFilter的使用

程序员文章站 2022-03-13 11:23:12
字符编码过滤器characterencodingfilter一、在web.xml中的配置

字符编码过滤器characterencodingfilter

一、在web.xml中的配置

 <!-- characterencodingfilter字符编码过滤器 -->
 <filter>
  <filter-name>characterencodingfilter</filter-name>
  <filter-class>org.springframework.web.filter.characterencodingfilter</filter-class>
  <init-param>
   <!--要使用的字符集,一般我们使用utf-8(保险起见utf-8最好)-->
   <param-name>encoding</param-name>
   <param-value>utf-8</param-value>
  </init-param>
  <init-param>
   <!--是否强制设置request的编码为encoding,默认false,不建议更改-->
   <param-name>forcerequestencoding</param-name>
   <param-value>false</param-value>
  </init-param>
  <init-param>
   <!--是否强制设置response的编码为encoding,建议设置为true,下面有关于这个参数的解释-->
   <param-name>forceresponseencoding</param-name>
   <param-value>true</param-value>
  </init-param>
 </filter>
 <filter-mapping>
  <filter-name>characterencodingfilter</filter-name>
  <!--这里不能留空或者直接写 ' / ' ,否者不起作用-->
  <url-pattern>/*</url-pattern>
 </filter-mapping>

二、characterencodingfilter过滤器类浅析

打开该类源码,可以看到该类有三个类属性

private string encoding; //要使用的字符集,一般我们使用utf-8(保险起见utf-8最好)
private boolean forcerequestencoding = false; //是否强制设置request的编码为encoding
private boolean forceresponseencoding = false; //是否强制设置response的编码为encoding

主要方法只有一个,也就是下面这个,代码逻辑很简单,如注释所解释

    @override
    protected void dofilterinternal(httpservletrequest request, httpservletresponse response, filterchain filterchain) throws servletexception, ioexception {
        string encoding = getencoding();
        if (encoding != null) { //如果设置了encoding的值,则根据情况设置request和response的编码
         //若设置request强制编码或request本身就没有设置编码
         //则设置编码为encoding表示的值
            if (isforcerequestencoding() || request.getcharacterencoding() == null) { 
                request.setcharacterencoding(encoding);
            }
         //若设置response强制编码,则设置编码为encoding表示的值
            if (isforceresponseencoding()) { //请注意这行代码,下面有额外提醒
                response.setcharacterencoding(encoding);
            }
        }
        filterchain.dofilter(request, response);
    }
# 额外提醒
if (isforceresponseencoding()) { 
 response.setcharacterencoding(encoding);
}

是在

filterchain.dofilter(request, response);

之前执行的,这也就是说这段代码的作用是设置response的默认编码方式,在之后的代码里是可以根据需求设置为其他编码的,即这里设置的编码可能不是最终的编码,网上很多文档说这里设置的是最终的编码方式,这是错的。

springmvc配置字符编码过滤器characterencodingfilter来解决表单乱码问题

1、get请求

针对get请求,可以配置服务器tomcat的conf\server.xml文件,在其第一个<connector>标签中,添加uriencoding="utf-8"即可,如下所示:

<connector uriencoding="utf-8" port="8080" protocol="http/1.1" connectiontimeout="20000" redirectport="8443" />

springmvc字符编码过滤器CharacterEncodingFilter的使用

2、post请求

但是,针对post请求,仅配置tomcat的server.xml文件中的<connector标签不足以解决乱码问题,因此,需要利用spring的字符编码过滤器

org.springframework.web.filter.characterencodingfilter

步骤:配置所开发项目的web.xml文件,添加以下内容至文件开头处即可:

<!-- ================start 配置spring的字符编码过滤器================ -->    
    <filter>
        <!-- 解决post乱码问题需要配置spring编码过滤器 -->
        <filter-name>characterencoding</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>
    </filter>
    <filter-mapping>
        <filter-name>characterencoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
<!-- ================end 配置spring的字符编码过滤器================ -->

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。