聲明:所有的代碼基於SpringBoot 2.0.3版本
Filter簡介
過濾器是對資源請求(servlet或靜態內容)或來自資源的響應或兩者執行過濾任務的對象。過濾器在doFilter方法中執行過濾。 每個過濾器都可以訪問FilterConfig(過濾器配置)對象,從中獲取初始化參數,以及一個可以使用的ServletContext引用,例如,加載過濾任務所需的資源。Servlet 2.3版本開始提供該接口。
過濾器在Web應用程序的部署描述符中配置。
已經使用過濾器設計的例子:
- Authentication Filters
- Logging and Auditing Filters
- Image conversion Filters
- Data compression Filters
- Encryption Filters
- Tokenizing Filters
- Filters that trigger resource access events
- XSL/T filters
- Mime-type chain Filter
Filter接口方法
-
void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws IOException,ServletException
客戶端每次請求一個資源,Web容器都會針對請求/響應調用過濾器。doFilter的典型應用模式如下:- 檢查請求
- (可選)使用自定義Filter包裝請求對象,以過濾請求的內容或header
- (可選)使用自定義Filer保證響應對象,以過濾響應的內容或header
- 將請求/響應傳遞給下一個Filter或者不進行傳遞以阻塞請求/響應的繼續處理
- 直接設置header
-
void init(javax.servlet.FilterConfig)
Web 容器調用該方法來使該過濾器可以被使用。在過濾器實例化後,servlet容器確保只調用一次過濾器的init方法。 要求過濾器執行任何過濾工作之前,init方法必須成功完成。過濾器的init方法執行過程中遇到一下問題時,Web容器不會配置該過濾器可用:- 拋出ServletException
- 沒有在Web容器設定的時間內返回
-
void destory()
Web容器調用該方法來停止該Filter。只有在過濾器的doFilter方法中的所有線程退出或超時後,Web容器纔會調用此方法。 在Web容器調用此方法之後,Web容器不會再調用此Filter的doFilter方法執行過濾任務。此方法使過濾器有機會清除所有正在保留的資源(例如,內存,文件句柄,線程),並確保任何持久狀態與過濾器在內存中的當前狀態同步。
SpringBoot中自定義Filter
在SpringBoot中一個類實現Filter接口,並通過簡單的@WebFilter和@Configuration註解配置即可實現過濾器功能,代碼示例如下:
@WebFilter(urlPatterns = "/user")
@Configuration
public class CustormFilter implements Filter {
private static final Logger log = LoggerFactory.getLogger(CustormFilter.class);
private String filterName;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterName = filterConfig.getFilterName();
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("Enter filter {}", filterName);
// 增加Request中的屬性值
servletRequest.setAttribute("custormFilter", filterName);
servletRequest.setAttribute("test", "test filter");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
log.info("filter {} destroy", filterName);
}
}
···
WebFilter主要參數
| 參數 |類型 | 功能 |
| - | :-: | :-: |
| description | String| Filter的簡單描述 |
| displayName | String | Filter的顯示名稱 |
| initParams | String[] | Filter的初始化參數 |
| filterName | String | Filter的名稱 |
| servletNames | String[] | 使用該Filter的Servlet的名稱 |
| urlPatterns | String[] | 使用該Filter的路徑URL |
| dispatcherTypes | DispatcherType | 使用該Filter的模式 |
| asyncSupported | boolean | 是否支持異步 |