iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 11
0

前言

因自己覺得filter應該和昨天的Listener一起討論才是
所以今天就來整理一下filter的部分
這個印象中以前還蠻常看到的
在此做點重點整理
為本書的ch13

Filter

Filterj是一種java元件
類似servlet,主要用在處理Servlet之前
先進行一些特定的處理
或是當Servlet完成後再去做特殊的處理
再回傳給client
主要也是設定在DD(Web.xml)裡

  • request的功能 => 即在執行Servlet前先做的處理
    執行安全性檢查
    重新格式化request的head或body
    稽查或記錄request

  • response的功能 => 即在執行Servlet後所做的處理
    壓縮回應串流
    附加或修改回應串流
    建立全然不同的response

  • life cycle
    Filter的生命週期就如同Servlet
    主要有三個特性:

    • Filter擁有自己的API,可以存取servletcontext,以及連結其他的filter
    • Container管理filter的life cycle
    • web可擁有多的filter,一個request可以有多個filter,並設定在DD裡

    所以Filter的life cycle可分為:

    • inin()
      由Container去instance,由filterConfig儲存
     private FilterConfig f;
      public void init(FilterConfig fConfig) throws ServletException {
      	this.f= fConfig;
      }   
    
    • doFilter()
      由下列三個參數組成
      • ServlerRequest
      • ServlerResponse
      • FilterChain
    • destroy()
      類似Servlet的destory
      在filter被銷毀前進行相關的清理工作
  • DD的宣告方式
    主要有三個步驟

    • 1.宣告filter
    <filter>
    	<filter-name>FilterNameRequest</filter-name>
    	<filter-class>com.Filter.MyFilter</filter-class>
    </filter>
    
    • 2.將filter和對應的Servlet去做設定
    <filter-mapping>
    	<filter-name>FilterNameRequest</filter-name>
    	<servlet-name>LoginServlet</servlet-name>
    </filter-mapping>
    
    • 3.將URL和filter name去做mapping
    <filter-mapping>
    	<filter-name>FilterNameRequest</filter-name>
    	<url-pattern>*.do</url-pattern>
    </filter-mapping>
    
    • 4.在Servlet2.4之後,dispatcher也可以使用在filter上
      主要為REQUEST(預設)、FORWARD 、INCLUDE 、ERROR
      為執行這些Servlet之前會先執行對應的filter
    <filter-mapping>
    	<filter-name>FilterNameRequest</filter-name>
    	<url-pattern>*.do</url-pattern>
    	<dispatcher>REQUEST</dispatcher>
    </filter-mapping>
    

    Container排序filter的規則:
    只要跟DD所設定的URL所有相符的filter都會被呼叫,由DD設定的順序去執行

Wrpper class

定義:
因為filter在處裡response時,FilterChain.doFilter(resquest,response)
已經將回應傳回client了,這樣並無法去實作response的狀況
因此wrpper class提供了一種可以實作的HttpServletResponse interface

FilterChain.doFilter(resquest,wrpperObj);
//將本來的response傳入一個wrpperObj,進行相關處理
//由wrpper決定response要回應的東西

今天也先概略的整理一下重點
接下來結合filter和Listener
去做一些小練習


上一篇
[Day 10] Listener 偵聽器
下一篇
[Day 12] Listener 練習 -1
系列文
30 days JSP & Servlet學習紀錄 30

尚未有邦友留言

立即登入留言