java web的過濾器
1.什麼是Filter
Filter稱為過濾器,它是Servlet技術中最實用的技術,web開發人員通過Filter技術,對web伺服器所管理的資源(JSP,Servlet,靜態圖片或靜態html檔案)進行攔截,從而實現一些特殊的功能。Filter就是過濾從客戶端向伺服器傳送的請求。
2.過濾器原理圖
3.過濾器的例子
1)過濾器的配置
<filter> <filter-name>FileDemo1</filter-name> <filter-class>filter.FilterDemo1</filter-class> </filter> <filter-mapping> <filter-name>FileDemo1</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
2)測試的例子FilterDemo1.java;
package filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class FilterDemo1 implements Filter{ public void destroy() { // TODO Auto-generated method stub } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub System.out.println("Filterdemo1執行了...."); // 放行 chain.doFilter(request, response); } public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } }
4.關於FilterChain物件
FilterChain過濾器鏈:在一個web應用中,可以開發編寫多個Filter,這些Filter組合起來稱為是一個過濾器鏈。Web伺服器根據Filter在web.xml檔案中的註冊順序(mapping的配置順序)決定先呼叫那個Filter。依次呼叫後面的過濾器,如果沒有下一個過濾器,呼叫目標資源。
5.Filter的生命週期
Filter的建立和銷燬是由web伺服器負責。Web應用程式啟動的時候,web伺服器建立Filter的例項物件。並呼叫其init方法進行初始化(filter物件只會建立一次,init方法也只會執行一次)。每次filter進行攔截的時候,都會執行doFilter的方法。當伺服器關閉的時候,應用從伺服器中移除的時候,伺服器會銷燬Filter物件。
6.FilterConfig物件的獲取
用來獲得Filter相關配置的物件;
FilterDemo2.java (獲取FilterConfig相關配合的小demo):
package filter;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class FilterDemo2 implements Filter{
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
System.out.println("Filter chain");
filterChain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
// 獲得過濾器的名稱
String filterName = filterConfig.getFilterName();
System.out.println(filterName);
// 獲取初始化引數
String username=filterConfig.getInitParameter("username");
String password=filterConfig.getInitParameter("password");
System.out.println(username);
System.out.println(password);
// 獲得所有初始化引數的名稱
Enumeration<String> names=filterConfig.getInitParameterNames();
while (names.hasMoreElements()) {
String name=names.nextElement();
String value = names.nextElement();
System.out.println(name+" "+value);
}
}
}
這個獲取xml檔案中的初始化引數;並將引數列印到後臺;
7.過濾器的相關配置
- 完全路徑匹配 :以/開始 比如/aaa /aaa/bbb
- 目錄匹配 :以/開始 以*結束 比如/* /aaa/* /aaa/bbb/*
- 副檔名匹配 :不能以/開始 以*開始 比如*.jsp *.do *.action
<servlet-name>的配置 專門以Servlet的配置的名稱攔截Servlet。
預設的情況下過濾器會攔截請求。如果進行轉發(需要攔截這次轉發)。
dispatcher的取值
- REQUEST :預設值。預設過濾器攔截的就是請求。
- FORWARD:轉發。
- INCLUDE :頁面包含的時候進行攔截
- ERROR :頁面出現全域性錯誤頁面跳轉的時候進行攔截
過濾器複習的一個綜合案例:
現在一個網站上需要有登入的功能,在登入成功後,重定向到後臺的成功頁面(後臺的頁面有很多)。如果現在沒有登入直接在位址列上輸入後臺頁面地址。編寫一個過濾器:可以對沒有登入的使用者進行攔截。(沒有登入,回到登入頁面。如果已經登入,放行。)
github程式碼地址:https://github.com/zhangyu345293721/login_filter