filter(過濾器)的簡單介紹
過濾器filter的簡介
filter 是對客戶端訪問資源的請求的過濾,當符合條件的時候放行,不符合條件的不放行,並且可以對目標資源訪問前後進行邏輯處理。
filter的工作流程大致如下所示:
如何編寫一個過濾器?
1.編寫一個過濾器的類實現 filter 介面。
2.實現介面中尚未實現的方法(著重實現 doFilter() 方法)
3.在web.xml中進行配置(主要是配置要對哪些資源進行過濾)
filter的api詳解
filter生命週期的相關方法
Filter介面有三個方法,並且這個三個都是與Filter的生命相關的方法
init(Filterconfig) 代表filter物件初始化方法 filter物件建立時執行
doFilter(ServletRequest,ServletResponse,FilterCha) 代表filter執行過濾的核心方法,如果某資源在已經被配置到這個filter進行過濾的話,那麼每次訪問這個資源都會執行doFilter方法
destory() 代表是filter銷燬方法 當filter物件銷燬時執行該方法
filter物件的生命週期
filter何時建立:伺服器啟動時就建立該filter物件
filter何時銷燬:伺服器關閉時filter銷燬
filter的api詳解
init(FilterConfig filterConfig)
其中引數 FilterConfig 代表該filter物件的配置資訊的物件,內部封裝是該filter的配置資訊。
destory()
filter物件銷燬時執行
doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain)
其中的引數:
ServletRequest/ServletResponse:每次在執行doFilter方法時,web容器負責建立一個request和一個response物件作為doFilter的引數傳遞進來。該request和該response就是在訪問目標資源的service方法時的request和response。
FilterChain:過濾器鏈物件,通過該物件的doFilter方法可以放行該請求。
下面是filter的工作流程:
案例介紹
/** * Copyright (C), 2018, hzhiping * Title:FilterDemo01 * Author:hzhiping * Date:2018/12/12 20:09 * Description: filter的api方法和過濾的相關api方法介紹 */ package com.hzhiping.filter; import javax.servlet.*; import java.io.IOException; public class FilterDemo01 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("過濾器初始化--------"); // filter建立的時候執行這個方法 // 獲取web.xml中filter的名稱 System.out.println(filterConfig.getFilterName()); // 獲取當前filter的初始化引數 System.out.println(filterConfig.getInitParameter("hzhiping")); // 獲取ServletContext filterConfig.getServletContext(); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("FilterDemo01執行之前-----"); // 讓目標資源放行 filterChain.doFilter(servletRequest,servletResponse); System.out.println("FilterDemo01執行之後-----"); } @Override public void destroy() { System.out.println("FilterDemo01銷燬------"); } }
寫完filter之後,編寫配置檔案 web.xml :
執行該案例:
filter的配置介紹
此處我們以一個完整的web.xml進行介紹filter的相關配置:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name>Archetype Created Web Application</display-name> <filter> <filter-name>filterDemo01</filter-name> <filter-class>com.hzhiping.filter.FilterDemo01</filter-class> <init-param> <param-name>hzhiping</param-name> <param-value>coder</param-value> </init-param> <init-param> <param-name>hzhihui</param-name> <param-value>student</param-value> </init-param> </filter> <filter-mapping> <filter-name>filterDemo01</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>ERROR</dispatcher> <dispatcher>INCLUDE</dispatcher> <dispatcher>ASYNC</dispatcher> </filter-mapping> </web-app>
filter:註冊一個過濾器
filter-name:過濾器的名稱
filter-class:過濾器所在的類的全路徑
init-param:初始化引數
param-name:引數名稱
param-value:引數值
filter-mapping:過濾器的對映
filter-name:過濾器名稱,通過這個來對映到註冊的過濾器,然後找到註冊的過濾器的所在的類
url-pattern:設定filter所攔截的請求路徑
1.完全匹配:/servlet01
2.目錄匹配:/aaa/bbb/*
/user/*:訪問前臺的資源進入此過濾器
/admin/*:訪問後臺的資源的時候執行此過濾器
3.副檔名匹配:*.html,*.jsp
dispatcher:訪問的方式(瞭解)
REQUEST:預設值,代表直接訪問某個資源時執行filter
FORWARD:轉發時才執行filter
INCLUDE: 包含資源時執行filter
ERROR:發生錯誤時 進行跳轉是執行filter
堅壁清野