Servlet 過濾器詳解

概念

Servlet 過濾器是可用於 Servlet 編程的 Java 類,實現了javax.servlet.Filter接口。可以實現以下目的:

  1. 在客戶端的請求訪問後端資源之前,攔截這些請求。
  2. 在服務器的響應發送回客戶端之前,處理這些響應。

工作原理

這裏寫圖片描述

這裏寫圖片描述

生命週期

這裏寫圖片描述

三個方法

init

public void init(FilterConfig filterConfig)

web 應用程序啓動時,web 服務器將創建Filter 的實例對象,並調用其init方法,讀取web.xml配置,完成對象的初始化功能,從而爲後續的用戶請求作好攔截的準備工作。Filter對象只會創建一次,init方法也只會執行一次。開發人員通過init方法的參數FilterConfig對象可獲得代表當前filter配置信息。

doFilter

public void doFilter (ServletRequest, ServletResponse, FilterChain)

該方法完成實際的過濾操作,當客戶端請求訪問與過濾器設置匹配的URL時,Servlet容器將先調用過濾器的doFilter方法。FilterChain參數調用chain.doFilter方法,將請求傳給下一個過濾器或目標資源,或利用轉發、重定向將請求轉發到其他資源。

destroy

public void destroy()

Servlet容器在銷燬過濾器實例前調用該方法,在該方法中釋放Servlet過濾器佔用的資源。

配置

需要在web.xml中配置。
1. filter可以有一個,filterMapping可以有多個;
2. 相同的url-pattern 組成過濾器鏈;
3. filter-mapping 元素的順序決定了 Web 容器應用過濾器到 Servlet 的順序。

這裏寫圖片描述

filter-mapping 元素的順序隻影響方法doFilter()方法的執行順序,init()和destroy()不受影響。

這裏寫圖片描述

過濾器鏈

執行過程

這裏寫圖片描述

這裏寫圖片描述

Dispatcher模式

默認
<dispatcher>REQUEST</dispatcher>

這裏寫圖片描述

實戰

解決編碼

<!--過濾器 解決亂碼-->
<filter>
  <filter-name>encoding</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>encoding</filter-name>
  <url-pattern>*</url-pattern>
</filter-mapping>

自定義過濾器

<!--登錄過濾器-->
<filter>
  <filter-name>userFilter</filter-name>
  <filter-class>com.wx.login.filter.UserFilter</filter-class>
  <init-param>
    <param-name>Site</param-name>
    <param-value>菜鳥網絡</param-value>
  </init-param>
</filter>

<filter-mapping>
  <filter-name>userFilter</filter-name>
  <url-pattern>*</url-pattern>
</filter-mapping>

執行結果

過濾器初始化

過濾器銷燬

擴展

@WebFilter

@WebFilter用於將一個類聲明爲過濾器,該註解將會在部署時被容器處理,容器將根據具體的屬性配置將相應的類部署爲過濾器。

@WebFilter配置

這裏寫圖片描述

@WebFilter常用屬性

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章