SpringBoot之Filter

聲明:所有的代碼基於SpringBoot 2.0.3版本

Filter簡介

過濾器是對資源請求(servlet或靜態內容)或來自資源的響應或兩者執行過濾任務的對象。過濾器在doFilter方法中執行過濾。 每個過濾器都可以訪問FilterConfig(過濾器配置)對象,從中獲取初始化參數,以及一個可以使用的ServletContext引用,例如,加載過濾任務所需的資源。Servlet 2.3版本開始提供該接口。

過濾器在Web應用程序的部署描述符中配置。

已經使用過濾器設計的例子:

  1. Authentication Filters
  2. Logging and Auditing Filters
  3. Image conversion Filters
  4. Data compression Filters
  5. Encryption Filters
  6. Tokenizing Filters
  7. Filters that trigger resource access events
  8. XSL/T filters
  9. 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 | 是否支持異步 |
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章