filter介紹:
filter主要用於對用戶請求request進行預處理,和對Response進行后處理,是個典型的處理鏈。
詳細解析起來就是:Filter對用戶請求進行預處理,接着將請求HttpServletRequest交給Servlet進行處理並生成響應,最后Filter再對服務器響應HttpServletResponse進行后處理。
其實Filter也可以看做是Servlet的加強版,Filter與Servlet具有完全相同的生命周期,且Filter也可以通過<init-param>來配置初始化參數,獲取Filter的初始化參數則使用FilterConfig的getInitParameter()。
Filter可負責攔截多個請求或響應;一個請求或響應也可被多個Filter攔截。
常用場合:
(1)認證Filter
(2)日志和審核Filter
(3)圖片轉換Filter
(4)數據壓縮Filter
(5)密碼Filter
(6)令牌Filter
(7)觸發資源訪問事件的Filter
(8)XSLT Filter
(9)媒體類型鏈Filter
如何創建Filter?
類似於servlet,需兩步
第一步:創建Filter處理類(一般我們都用現有的)
Filter必須實現javax.servlet.Filter接口,在該接口中定義了三個方法:
(1) void init(FilterConfig config):用於Filter的初始化。FilteConfig用於訪問Filter的配置信息。
(2) void destroy():Filter銷毀前的操作,例如完成某些資源的回收。
(3) void doFilter(ServletRequest request,ServletResponse response,FilterChain chain):
實現過濾功能的核心方法,實現對請求request進行預處理,也可以實現對服務器響應response進行后處理---它們的分界線為是否調用了chain.doFilter(request,response),執行該方法之前,即對用戶
請求request進行預處理,執行該方法之后,即對服務器響應response進行后處理。
第二步:Web.xml文件中配置Filter
Filter配置與Servlet的配置非常相似,區別在於Servlet通常只配置一個URL,而Filter可以同時配置多個請求的URL。配置Filter有兩種方式:
(1). 在Filter類中通過Annotation進行配置。
(2). 在web.xml文件中通過配置文件進行配置。
這里我們使用web.xml這種配置方式,下面重點介紹<filter>內包含的一些元素。
(1).<filter-name>用來定義過濾器的名稱,該名稱在整個程序中都必須唯一。
(2).<filter-class>元素指定過濾器類的完全限定的名稱,即Filter的實現類。
(3). <init-param>為Filter配置參數,與<context-param>具有相同的元素描述符<param-name>和<param-value>。
(4). <filter-mapping>元素用來聲明Web應用中的過濾器映射,過濾器被映射到一個servlet或一個URL 模式。這個過濾器的<filter>和<filter-mapping>必須具有相同的<filter-name>,指定該Filter所攔截的URL。過濾是按照部署描述符的<filter-mapping>出現的順序執行的。