springmvc字符編碼過濾器CharacterEncodingFilter的使用

字符編碼過濾器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" />

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的字符編碼過濾器================ -->

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: