JavaWeb 之 18.過濾器
## 過濾器(重點) ##
**過濾器的概述**
1.過濾器是雙向的
2.攔截一堆目標資源。(由配置檔案決定)
**過濾器的簡單入門**
1.編寫一個類,實現filter介面,重寫3個方法
2.在web.xml中進行配置。
<!-- 配置過濾器的資訊 -->
<filter>
<!-- 配置名字 -->
<filter-name>FilterDemo1</filter-name>
<!-- 包名+類名 -->
<filter-class>cn.itcast.filter.FilterDemo1</filter-class>
</filter>
<!-- 配置過濾器的對映 -->
<filter-mapping>
<filter-name>FilterDemo1</filter-name>
<!-- 配置訪問方式 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
**FilterChain物件**
1.doFilter(ServletRequest request, ServletResponse response) 執行下一個過濾器,如果沒有下一個過濾器,訪問目標資源。
**過濾器的生命週期**
1.Servlet生命週期:Servlet什麼時候建立?預設不是由伺服器啟動時建立的,第一次訪問的建立。呼叫init方法進行初始化操作。
Servlet什麼是銷燬?伺服器關閉的時候或者移除專案時候。預設呼叫destroy()方法。
2.過濾器的生命週期:
* void init(FilterConfig filterConfig) -- 過濾器什麼時候建立的?
* void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) -- 放行
* void destroy() -- 過濾器什麼時候銷燬
3.總結:伺服器啟動的時候建立過濾器例項(單例的),預設呼叫init方法進行初始化操作,doFilter方法就會執行。有一次執行一次。過濾器是關閉伺服器或者移除專案銷燬,銷燬之前呼叫destroy方法進行銷燬。
**FilterConfig介面**
1.ServletConfig
* 獲取servlet-name的名稱
* 獲取初始化引數
* 獲取ServletContext物件
2.FilterConfig物件的方法
* String getFilterName() -- 獲取<filter-name>的名稱
* String getInitParameter(String name) -- 獲取初始化引數的值(重點)
* Enumeration getInitParameterNames() -- 獲取初始化引數(重點)
* ServletContext getServletContext() -- 獲取ServletContext域物件(重點)
**過濾器的配置**
1.配置<filter>
* <filter-name> -- 配置filter的名稱
* <filter-class> -- 包名+類名
* <init-param> -- 配置初始化引數
2.配置<filter-mapping>
* <filter-name> -- 配置filter的名稱和<filter>標籤中的<filter-name>配置必須是相同的。
* <url-pattern> -- 配置過濾的路徑
* 完全路徑匹配 以/開頭的 /aa /aa/bb localhost/day21/aa/bb
* 目錄匹配 以/開頭的 /* /aa/* localhost/day21/aa/bb
* 副檔名匹配 不能以/開頭 *.jsp 訪問所有的jsp都會被攔截
* 優先順序:完全路徑 > 目錄匹配 > 副檔名匹配
* 在web.xml中配置2個(A,B)過濾器,每個過濾器的配置都是/* AB過濾器執行順序是什麼樣的?
* 和在web.xml中的配置(<filter-mapping>)順序有關。
* <servlet-name> -- 過濾器過濾指定的servlet 直接配置Servlet的名稱
* <dispatcher>
* REQUEST -- 預設只攔截請求。REQUEST也是預設值。
* FORWARD -- 只攔截轉發的
* INCLUDE -- 包含
* ERROR -- 需要在web.xml進行配置
**過濾器的案例**
**設定全域性的編碼**
1.每次在編寫表單和向頁面做出響應的時候,都需要設定request和response的一些資訊。
2.那咱們就可以使用過濾器來解決類似的問題。
**禁用瀏覽器的快取**
1.記住CEP三個頭。日期型別。
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
// 第三個頭是日期型別
response.setDateHeader("Expires", -1);
**分ip統計訪問的次數**
1.怎麼獲取ip地址:request.getRemoteAddr()
* 1.獲取map
* 2.獲取ip
* 3.在map中和ip做對比
* * 如果map中有ip,獲取count,+1
* * 如果map中沒有ip,把ip和count=1存入到map中
* 4.把map存入到ServletContext中
* 5.放行
**自動登陸的功能**
1.依賴登陸的功能。已搞定。
2.分析需求:必須先登陸,並且選擇自動登陸的按鈕。下一次再直接訪問suc.jsp的時候,直接進去了,不用再登陸了。
3.分析哪些技術?
* 需要先使用cookie,cookie可以記住使用者名稱和密碼。下一次請求,預設攜帶cookie過來了。
* 還需要session,第一次登陸的時候,把使用者名稱和密碼儲存到session中。通過session來判斷是否登陸成功。
* 過濾器,攔截的目的:獲取cookie,獲取使用者名稱和密碼,和資料庫查詢,匹配了,把使用者的資訊放入session中。
4.cookie技術,儲存資料,回寫到瀏覽器。設定有效時間。
* 把使用者名稱和密碼儲存起來。回寫到客戶端上。
5.分析的過程
* 在過濾器中可以直接獲取session中的使用者資訊,如果user不為空,說明瀏覽器沒關。放行。
* 從session中獲取不到user的資訊
* 先獲取cookie,獲取指定名稱的cookie,
* 如果cookie為空,放行。
* 如果cookie不為空,獲取使用者名稱和密碼。去資料庫查詢。
* 如果查詢不到,cookie的資訊不正確,放行(沒有存入session中)。
* 如果查詢到了,cookie中的資訊是正確,把使用者的資訊儲存到session中。放行。
**URL級別(粗粒度)的許可權驗證**
1.需求:依賴使用者登陸的功能。如果你的使用者的type型別是admin,只能讓使用者訪問/admin/xxx.jsp檔案。如果使用者的type是usesr的話,只能訪問/user/xxx.jsp的檔案。
2.分析: