1. 程式人生 > >java web的過濾器

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.過濾器的相關配置

  1. 完全路徑匹配           :以/開始   比如/aaa  /aaa/bbb
  2. 目錄匹配                    :以/開始 以*結束  比如/*  /aaa/*  /aaa/bbb/*
  3. 副檔名匹配               :不能以/開始 以*開始 比如*.jsp  *.do   *.action

<servlet-name>的配置 專門以Servlet的配置的名稱攔截Servlet。

預設的情況下過濾器會攔截請求。如果進行轉發(需要攔截這次轉發)。

dispatcher的取值

  1. REQUEST :預設值。預設過濾器攔截的就是請求。
  2. FORWARD:轉發。
  3. INCLUDE :頁面包含的時候進行攔截
  4. ERROR     :頁面出現全域性錯誤頁面跳轉的時候進行攔截

過濾器複習的一個綜合案例:

         現在一個網站上需要有登入的功能,在登入成功後,重定向到後臺的成功頁面(後臺的頁面有很多)。如果現在沒有登入直接在位址列上輸入後臺頁面地址。編寫一個過濾器:可以對沒有登入的使用者進行攔截。(沒有登入,回到登入頁面。如果已經登入,放行。)

github程式碼地址:https://github.com/zhangyu345293721/login_filter