1. 程式人生 > >Spring Servlet Web 5.1.3 常用過濾器 : CharacterEncodingFilter

Spring Servlet Web 5.1.3 常用過濾器 : CharacterEncodingFilter

概述

該過濾器允許指定字符集處理使用者請求或者響應。在瀏覽器沒有對請求指定字符集的情況下,我們可以使用該方案指定使用那種字符集處理請求。

該過濾器應用在請求缺少字符集資訊時會應用指定的字符集,但也可以通過設定過濾器屬性forceRequestEncodingtrue強制使用制定給過濾器的字符集。實際上,也可以通過設定過濾器屬性forceResponseEncodingtrue強制響應使用指定給過濾器的字符集。

該過濾器繼承自OncePerRequestFilter,也就是說,它在整個請求處理過程中最多隻會被應用一次。

Springboot 提供了一個OrderedCharacterEncodingFilter

繼承自CharacterEncodingFilter應用在基於SpringbootWeb應用中。OrderedCharacterEncodingFilterCharacterEncodingFilter的功能上增加了介面OrderedFilter定義的過濾器順序,並且預設使用最高優先順序。換句話講,它會是整個過濾器鏈中第一個被呼叫的過濾器。

Springboot預設會根據配置屬性spring.http.encoding設定OrderedCharacterEncodingFilter的字符集和forceRequestEncoding/forceResponseEncoding。預設情況下,它們的分別使用:UTF-8

,false,false。參考自動配置HttpEncodingAutoConfiguration

原始碼解析

package org.springframework.web.filter;

import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import
org.springframework.lang.Nullable; import org.springframework.util.Assert; public class CharacterEncodingFilter extends OncePerRequestFilter { // 制定給該過濾器的字符集(也可以理解為編碼方式) @Nullable private String encoding; // 是否強制請求使用指定的字符集 private boolean forceRequestEncoding = false; // 是否強制響應使用指定的字符集 private boolean forceResponseEncoding = false; // 建構函式 ,執行之後 : // encoding : null // forceRequestEncoding : false // forceResponseEncoding : false public CharacterEncodingFilter() { } // 建構函式 ,執行之後 : // encoding : 同參數encoding // forceRequestEncoding : false // forceResponseEncoding : false public CharacterEncodingFilter(String encoding) { this(encoding, false); } // 建構函式 ,執行之後 : // encoding : 同參數encoding // forceRequestEncoding : 同參數forceEncoding // forceResponseEncoding : 同參數forceEncoding public CharacterEncodingFilter(String encoding, boolean forceEncoding) { this(encoding, forceEncoding, forceEncoding); } // 建構函式 ,執行之後 : // encoding : 同參數encoding // forceRequestEncoding : 同參數 forceRequestEncoding // forceResponseEncoding : 同參數 forceResponseEncoding public CharacterEncodingFilter(String encoding, boolean forceRequestEncoding, boolean forceResponseEncoding) { Assert.hasLength(encoding, "Encoding must not be empty"); this.encoding = encoding; this.forceRequestEncoding = forceRequestEncoding; this.forceResponseEncoding = forceResponseEncoding; } // 可以在建構函式執行之後設定字符集 public void setEncoding(@Nullable String encoding) { this.encoding = encoding; } /** * Return the configured encoding for requests and/or responses. * @since 4.3 */ @Nullable public String getEncoding() { return this.encoding; } // 可以在建構函式執行之後指定 forceRequestEncoding/forceResponseEncoding都為forceEncoding public void setForceEncoding(boolean forceEncoding) { this.forceRequestEncoding = forceEncoding; this.forceResponseEncoding = forceEncoding; } // 可以在建構函式執行之後指定 forceRequestEncoding public void setForceRequestEncoding(boolean forceRequestEncoding) { this.forceRequestEncoding = forceRequestEncoding; } /** * Return whether the encoding should be forced on requests. * @since 4.3 */ public boolean isForceRequestEncoding() { return this.forceRequestEncoding; } // 可以在建構函式執行之後指定 forceResponseEncoding public void setForceResponseEncoding(boolean forceResponseEncoding) { this.forceResponseEncoding = forceResponseEncoding; } /** * Return whether the encoding should be forced on responses. * @since 4.3 */ public boolean isForceResponseEncoding() { return this.forceResponseEncoding; } @Override protected void doFilterInternal( HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 獲取指定給該過濾器使用的字符集 String encoding = getEncoding(); if (encoding != null) { // 如果指定了字符集 if (isForceRequestEncoding() || request.getCharacterEncoding() == null) { // 如果指定了字符集 // 並且 forceRequestEncoding 或者 請求沒有字符集資訊,則請求使用指定的字符集 request.setCharacterEncoding(encoding); } if (isForceResponseEncoding()) { // 如果指定了字符集 // 並且 forceResponseEncoding , 則響應使用指定的字符集 response.setCharacterEncoding(encoding); } } filterChain.doFilter(request, response); } }