對於WEB應用來講,過濾器是一個駐留在服務器中的WEB組件,他能夠截取客戶端和WEB資源之間的請求和響應信息。html
在一個WEB應用中能夠部署多個過濾器,多個過濾器就組成了一個過濾器鏈,請求和響應必須在通過多個過濾器後才能到達目標java
當配置多個Filter之後就有一個執行順序的問題,實際執行順序是按照在web.xml文件中servlet-mapping的順序決定的,若是順序越靠前越先被調用。web
小程序
服務器
做用:1.檢查用戶訪問權限session
app
jsp
doFilter(ServletRequest,ServletResponse,FilterChain)做用和service()方法相似,是過濾請求和響應的主要方法。編碼
url
getFilterName() 獲取Filter的名字
getServletContext() 獲取ServletContext對象(即application)
getInitParameter(String) 獲取Filter的初始化參數
web.xml文件中的Filter配置
<filter-mapping> <!-- Filter的名字 --> <filter-name>Filter1</filter-name> <!-- Filter1的過濾地址,表示過濾http://127.0.0.1:8080/day17/admin/user.jsp--> <url-pattern>/admin/user.jsp</url-pattern> </filter-mapping>
除此以外在filter-mapping還有一個子標籤dispatcher,該標籤用來指定須要Filter處理的請求類型
<!-- 用戶直接訪問資源時,會調用Filter --> <dispatcher>REQUEST</dispatcher> <!-- 經過轉發訪問時,會調用Filter --> <dispatcher>FORWARD</dispatcher> <!-- 經過動態包含獲取時,會調用Filter --> <dispatcher>INCLUDE</dispatcher> <!-- 當經過異常處理訪問頁面時,會調用Filter --> <dispatcher>ERROR</dispatcher>
這四種狀況能夠設置一個,也能夠同時設置多個,若是不設置那麼默認爲REQUEST
而後執行Filter的init()方法,對象建立後,立刻就被調用,對Filter作一些初始化操做
執行Filter的doFilter()方法,每次訪問目標資源,只要匹配過濾的地址,就會調用。
獲取Filter在web.xml文件中配置的名稱
獲取Filter在web.xml文件中配置的初始化參數
// 獲取Filter的名稱 String filterName = filterConfig.getFilterName();// 獲取初始化參數。username的值 String username = filterConfig.getInitParameter("username");// 獲取ServletContext的對象實例 ServletContext ctx = filterConfig.getServletContext();
通常Filter.doFilter中的代碼分爲三段:
第一段是FilterChain.doFilter以前的代碼。通常用來作請求的攔截,檢查用戶訪問的權限,訪問日記的記錄。參數編碼的設置等等操做。
第二段是FilterChain.doFilter方法。此方法能夠將代碼的執行傳遞到下一個Filter中。或者是傳遞到用戶最終訪問的資源中。
第三段是FilterChain.doFilter以後的代碼。主要用過作一些日誌操做。咱們不多會在第三段中作太多複雜的操做。
主要有如下兩種
精確匹配:/路徑/資源名
好比:/index.html、/hello/index.jsp 、 /client/LoginServlet 等,只有在請求地址徹底同樣時纔會調用Filter
目錄匹配:/路徑名/*
好比1:/abc/* 表示能夠攔截abc目錄下的全部資源,甚至是abc目錄下的其餘目錄。
好比2:/* 表示只要訪問項目根目錄下的資源就會調用Filter
後綴名匹配:*.後綴名
好比:*.jsp 表示攔截全部後綴爲jsp文件資源
第二種:經過filter-mapping中的servlet-name來指定要過濾的Servlet
在Filter的filter-mapping中增長了一個servlet-name標籤,將該標籤的值設置成Servlet的名字,在訪問Servlet時就會調用該過濾器過濾請求。
<filter-mapping> <filter-name>HelloFilter</filter-name> <servlet-name>HelloServlet</servlet-name> </filter-mapping>
Listener用於監聽JavaWeb程序中的事件,當事件被觸發時,監聽器中的指定方法將會被調用。
做用:監聽ServletContext對象的建立與銷燬
方法:
public void contextInitialized ( ServletContextEvent sce ):ServletContext建立時調用
public void contextDestroyed ( ServletContextEvent sce ):ServletContext銷燬時調用
ServletContextEvent對象
做用:public ServletContext getServletContext ():獲取ServletContext對象
HttpSessionListener
做用:監聽HttpSession對象的建立與銷燬
方法:
public void sessionCreated ( HttpSessionEvent se ):HttpSession對象建立時調用
public void sessionDestroyed ( HttpSessionEvent se ):HttpSession對象銷燬時調用
HttpSessionEvent對象
做用:public HttpSession getSession ():獲取當前HttpSession對象
ServletRequestListener
做用:監聽ServletRequest對象的建立與銷燬
方法:
public void requestInitialized ( ServletRequestEvent sre ):ServletRequest對象建立時調用
public void requestDestroyed ( ServletRequestEvent sre ):ServletRequest對象銷燬時調用
ServletRequestEvent對象
做用:
public ServletRequest getServletRequest ():獲取當前的ServletRequest對象。
三種建立與銷燬的監聽器使用起來基本一致。
在web.xml文件中註冊監聽器
<listener> <listener-class>com.web.listener.MyServletContextListener</listener-class> </listener>
做用:監聽ServletContext中屬性的建立、修改和銷燬
方法:
public void attributeAdded(ServletContextAttributeEvent scab):向ServletContext中添加屬性時調用
public void attributeRemoved(ServletContextAttributeEvent scab):從ServletContext中移除屬性時調用
public void attributeReplaced(ServletContextAttributeEvent scab):當ServletContext中的屬性被修改時調用
ServletContextAttributeEvent對象
做用:
public String getName() :獲取修改或添加的屬性名
public Object getValue():獲取被修改或添加的屬性值
public ServletContext getServletContext ():獲取當前WEB應用的ServletContext對象
HttpSessionAttributeListener
做用:監聽HttpSession中屬性的建立、修改和銷燬
方法:
public void attributeAdded ( HttpSessionBindingEvent se ):向HttpSession中添加屬性時調用
public void attributeRemoved(HttpSessionBindingEvent se):從HttpSession中移除屬性時調用
public void attributeReplaced(HttpSessionBindingEvent se):當HttpSession中的屬性被修改時調用
HttpSessionBindingEvent對象
做用:
public String getName() :獲取修改或添加的屬性名
public Object getValue():獲取被修改或添加的屬性值
public HttpSession getSession ():獲取當前的HttpSession對象
ServletRequestAttributeListener
做用:監聽ServletRequest中屬性的建立、修改和銷燬
方法:
public void attributeAdded (ServletRequestAttributeEvent srae ):向ServletRequest中添加屬性時調用
public void attributeRemoved(ServletRequestAttributeEvent srae):從ServletRequest中移除屬性時調用
public void attributeReplaced(ServletRequestAttributeEvent srae):當ServletRequest中的屬性被修改時調用
ServletRequestAttributeEvent對象
做用:
public String getName():獲取修改或添加的屬性名
public Object getValue():獲取被修改或添加的屬性值
做用:監聽某個對象在session域中的建立與移除。
方法:
public void valueBound(HttpSessionBindingEvent event):該類的實例被放到Session域中時調用
public void valueUnbound(HttpSessionBindingEvent event):該類的實例從Session中移除時調用
HttpSessionBindingEvent對象
做用:
public HttpSession getSession ():獲取HttpSession對象
public String getName():獲取操做的屬性名
public Object getValue():獲取操做的屬性值
做用:監聽某個對象在session中的序列化與反序列化。
方法:
public void sessionWillPassivate(HttpSessionEvent se):該類實例和Session一塊兒鈍化到硬盤時調用
public void sessionDidActivate(HttpSessionEvent se):該類實例和Session一塊兒活化到內存時調用
HttpSessionEvent對象
做用:
public HttpSession getSession ():獲取HttpSession對象
注意:爲被監聽類對象能夠正常序列化到硬盤上,還須要讓該類實現java.io.Serializable接口