過濾Servlet--過濾器

00潤物無聲00發表於2016-08-30

  從使用上看Servlet分為簡單Servlet,過濾Servlet(過濾器)和監聽Servlet(監聽器),這裡重點介紹過濾器。


  


基本概念:

  Filter是Servlet2.3之後增加的新功能,當需要限制使用者訪問某些資源或者在處理請求時,提前處理某些資源時,可使用過濾器。

  過濾器是以一種元件的形式繫結到Web應用程式中的,支援熱插拔。

  過濾器採用鏈的方式處理


過濾器實現:

  1.實現Filter介面 

  直接讓類實現javax.servlet.Filter介面,就定義了一個Filter,該介面定義了3個操作方法;

	public void init(FilterConfig filterConfig) throws ServletException {
		//過濾器初始化時呼叫,通過FilterConfig取得配置的初始化引數。   引數在Web.xml中配置<inti-param> 
	}
	
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
<span style="white-space:pre">		</span>//完成具體過濾操作,通過FilterChain,鏈式傳遞下去;
	}
	
	public void destroy() {  //銷燬時使用
	}

  doFilter方法為核心方法,引數中的FilterChain介面,可以將請求向下繼續傳遞給其他過濾器或者Servlet;

	public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {
<span style="white-space:pre">		</span>//請求向下繼續傳遞
	}

  2.配置Web.xml檔案

  1.配置Filter對映的類,<filter-class>

  2.配置Filter初始化引數;<init-param>

  3.配置過濾器的過濾位置;<url-pattern>

    (1)擴充套件匹配 *.jsp

    (2)路徑字首匹配,包含一個目錄和一個/*

    (3)全部匹配 /*

	<filter>
		<filter-name>CharsetEncodingFilter</filter-name>
		<filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class>
<!-- 		傳遞引數 -->
		<init-param>
			<param-name>encoding</param-name>
			<param-value>GBK</param-value>
		</init-param>
	</filter>
	<!-- 	設定Filter對那些檔案起作用;這裡設定對Jsp頁面起作用; -->
	<filter-mapping>
		<filter-name>CharsetEncodingFilter</filter-name>
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>
	

  3.呼叫過程

  過濾器初始化時,初始化方法在容器中自動載入,通過FilterConfig的getInitParameter()方法讀取配置的初始化引數,只初始化一次.

  doFilter方法會在請求和響應時分別呼叫。呼叫兩次;

  

應用:

  filter可用來進行字元編碼的過濾,檢測使用者是否登陸的過濾,禁止頁面快取等。


  Filter是以一種元件的形式,橫切入請求中的,支援熱插拔,不會對程式碼產生影響;

  Filter加入前

    

  Filter加入後

    

  

  為了解決中文亂碼問題,在所有的請求中都加入了對於字符集的設定。這樣會造成大量重複的程式碼,這裡用Servlet中的過濾器Filter統一設定字符集,將編碼格式的設定放入到Filter中.

package com.bjpowernode.drp.util.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;

/**
 * 採用Filter統一處理字符集
 * @author fxq
 *
 */
public class CharsetEncodingFilter implements Filter {
	private String encoding;
	
	public void init(FilterConfig filterConfig) throws ServletException {
		this.encoding=filterConfig.getInitParameter("encoding");
		System.out.println("CharsetEncodingFilter.init()-->>encoding="+encoding);
	}
	
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		
		System.out.println("CharsetEncodingFilter---->>>begin");
		//設定字符集
		request.setCharacterEncoding("GB18030");
		//繼續往下執行,並返回來;
		chain.doFilter(request, response);
		
		System.out.println("CharsetEncodingFilter---->>>end");
	}
	
	public void destroy() {
	}

}


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	
	<filter>
		<filter-name>CharsetEncodingFilter</filter-name>
		<filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class>
<!-- 		傳遞引數 -->
		<init-param>
			<param-name>encoding</param-name>
			<param-value>GBK</param-value>
		</init-param>
	</filter>
	<!-- 	設定Filter對那些檔案起作用;這裡設定對Jsp頁面起作用; -->
	<filter-mapping>
		<filter-name>CharsetEncodingFilter</filter-name>
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>
	
</web-app>


  通過Web.xml中配置,Filter只對所有的Jsp起作用,當向Jsp傳送請求時,會先通過過濾器執行init和doFilter方法,設定字符集,進行統一配置;


總結

  Filter在請求前,先進行處理,並決定是否繼續往下鏈式傳遞,幫助我們解決類似字元統一的共享問題,減少程式碼重複。在使用的過程中應該考慮過濾和效能問題,把需要通過過濾的請求,做的詳細而不是讓所有的都執行過濾器。


相關文章