servlet過濾器是伺服器與用戶端請求與回應的中間層元件,它主要是用於對瀏覽器的請求進行過濾處理,並將過濾後的請求再轉給下一個資源。
【推薦教學:Java教學】
servlet過濾器的基本概念
Servlet過濾器從字面上的字意理解為經過一層次的過濾處理才達到使用的要求,而其實Servlet過濾器就是伺服器與客戶端請求與回應的中間層元件,在實際專案開發中Servlet過濾器主要用於對瀏覽器的請求進行過濾處理,將過濾後的請求再轉給下一個資源。
Filter是在Servlet 2.3之後增加的新功能,當需要限制使用者存取某些資源或在處理請求時提前處理某些資源的時候,就可以使用過濾器完成。
過濾器是以一種元件的形式綁定到WEB應用程式當中的,與其他的WEB應用程式元件不同的是,過濾器是採用了「鏈」的方式進行處理的。
Filter
#Servlet過濾器Fileter是一個小型的web元件,它們透過攔截請求和回應,以便查看、提取或以某種方式操作客戶端和伺服器之間交換的數據,實現「過濾」的功能。 Filter通常封裝了一些功能的web元件,過濾器提供了一種物件導向的模組化機制,將任務封裝到一個可插入的元件中, Filter元件透過設定檔來聲明,並動態的代理程式。
簡單來說Servlet的Filter是:
● 聲明式的:透過在web.xml設定檔中聲明,允許新增、刪除過濾器,而無需改變任何應用程式程式碼或jsp頁面。
● 靈活的:過濾器可用於客戶端的直接呼叫執行預處理和後期的處理工作,透過過濾鏈可以實現一些靈活的功能。
● 可移植的:由於現今各個web容器都是以Servlet的規範進行設計的,因此Servlet過濾器同樣是跨容器的。
● 可重複使用的:基於其可移植性和宣告式的設定方式,Filter是可重複使用的。
總的來說,Servlet的過濾器是透過一個設定檔來靈活的宣告的模組化可重複使用元件。過濾器動態的截獲傳入的請求和傳出的回應,在不修改程式碼的情況下,透明的新增或刪除他們。其獨立於任何平台和web容器。
Filter工作原理
基於Filter體系結構的描述,我們可以看出Filter的工作原理,簡單的透過一個流程圖加以示範:
客戶端瀏覽器在存取web伺服器的某個特定資源的時候,經過過濾器1中code1程式碼區塊的相關處理之後,將request請求傳遞給過濾鏈中的下一個過濾器2,(過濾鏈的順序以設定檔中的順序為基準)過濾器2處理完之後,request就傳遞的Servlet完成對應的邏輯。回傳回應的過程類似,只是過濾鏈的順序相反,這裡就不多說了。
Filter的建立過程
要寫一個篩選器必須實作Filter介面。實現其介面規定的方法。
★ 實作javax.servlet.Filter介面
★ 實作init方法,讀取過濾器的初始化參數
★ 實作doFilter方法,完成對請求或回應的過濾
★ 呼叫FilterChain介面物件的doFilter方法,向後續的過濾器傳遞請求或回應
一個最基本的過濾器實作程式碼:
java類:
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class BasicsFilter implements Filter { public BasicsFilter() { // 容器(服务器)启动时执行 } /** * @see Filter#init(FilterConfig) */ public void init(FilterConfig fConfig) throws ServletException { /* 容器(服务器)时执行 */ System.out.println("======== 初始化方法 ========"); // 获取的是web.xml中配置Filter时设置的值,参数为设置值得名称,若参数不存在,则返回空 String initParam = fConfig.getInitParameter("param"); System.out.println("param ========" + initParam); } /** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { /* 在访问的时候执行 */ System.out.println("======= 开始执行doFilter ========"); // 转发到下一个组件,进行后续的处理(组件可以是一个过滤器,也可以是一个servlet) chain.doFilter(request, response); System.out.println("======= 结束执行doFilter ========"); } /** * @see Filter#destroy() */ public void destroy() { // TODO Auto-generated method stub } }
web.xml設定:
<filter> <filter-name>basicsFilter</filter-name> <filter-class>com.hudongwu.filter.BasicsFilter</filter-class> <init-param><!-- 设置在过滤器中执行初始化方法时,获取的值 --> <param-name>param</param-name> <param-value>studyFilter</param-value> </init-param> </filter> <filter-mapping> <filter-name>basicsFilter</filter-name> <!-- 设置为访问该网站所有地址都需要通过该过滤器 --> <url-pattern>/*</url-pattern> <!-- 设置为只有访问该网站的/Helloword地址时才通过该过滤器 --> <url-pattern>/Helloword</url-pattern> </filter-mapping>
以上是什麼是servlet過濾器的詳細內容。更多資訊請關注PHP中文網其他相關文章!