Servlet過濾器Filter詳解

Filter概述

1、Filter意爲過濾鏡或者過濾器,用於在Servlet之處對request或者response進行修改。Filter提出了過濾鏈(FilterChain)的概念。這個概念體現了設計模式中的責任鏈模式。

2、使用Filter的好處是可拆卸,如果不再需要過濾,只需要將Filter配置註釋掉即可。

3、Filter的處理過程:

                                              

Filter基本使用方法

1、定義我們自己的過濾器Filter時,首先需要編寫一個普通Java類去實現javax.servlet.Filter接口,Filter接口中分別有init(),doFilter()和destory()方法分別表示初始化Filte、,處理業務方法和Filter銷燬方法這個三個方法表示一個Filter的生命週期;當定義好自己的過濾器Filter後,需要在工程的配置文件web.xml中加上過濾器的配置方法。

2、下面是一個字符串過濾器的案例:

首先定義一個過濾器類:

<span style="color:#000000;">package com.ajax.util;
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 CharacterEncodingFilter implements Filter{
	private String characterEnconding;
	private boolean enable;
	//過濾器初始化的時候調用
	@Override
	public void init(FilterConfig config) throws ServletException {
		System.out.println("過濾器初始化========讀取過濾器中的參數");
		characterEnconding=config.getInitParameter("characterEncoding");
		enable="true".equalsIgnoreCase(config.getInitParameter("Enable").trim());
	}
	//過濾器的業務方法
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		System.out.println("過濾器運行===============");
		if(enable || characterEnconding!=null){
                        //設置編碼方式
                        request.setCharacterEncoding(characterEnconding);
			response.setCharacterEncoding(characterEnconding);
			chain.doFilter(request, response);
		}
	}
	//過濾器銷燬時調用
	@Override
	public void destroy() {
		System.out.println("過濾器銷燬========");
                //關閉資源
                characterEnconding=null;
	}
}</span>

然後在web.xml中加入過濾器的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>
  <!--配置過濾器  -->
  <filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class> com.ajax.util.CharacterEncodingFilter</filter-class>
     <!--過濾器的初始化參數-->
    <init-param>
       <param-name>characterEncoding</param-name>
       <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
       <param-name>Enable</param-name>
       <param-value>true</param-value>
    </init-param>
  </filter>
  
  <!--全局上下文參數  -->
  <context-param>
     <param-name>contextParam</param-name>
     <param-value>這是一個全局上下文參數</param-value>
  </context-param>
  <!--過濾器的攔截規則 -->
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
 <!-- 設置系統初始化的首頁 -->
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

注:在一個Web程序中可以配置多個Filter,這個Filter執行順序有先有後的。規則是在<filter-mapping>中,配置在前面的會先執行。

Filter適用的案例

過濾器可以適用於很多方面

1、防盜鏈Filter:實現的效果是如果其它網站引用本網站的圖片資源,將會顯示一個錯誤圖片。

2、字符編碼Filter:常用來解決Tomcat服務器裏Request、Response的亂碼問題。

3、日誌記錄Filter:記錄日誌也是Filter擅長的工作之一。在request之前與之後都可以記錄日誌。

4、異常捕捉Filter:在Filter中,如果在chain.doFilter(request,response)上加上一個try...catch語句,就要捕獲Servlet中拋出的可預料的與不可以預料的異常,然後根據不同異常進行處理。

5、權限驗證Filter:一般是用來驗證一些用戶是否對某個操作有操作的權限。

6、內容替換Filter:可以過濾一些敏感的詞彙。

7、緩存Filter:對於訪問量比較大的網站,反覆的查詢數據庫要消耗很多時間。所以我們可以在第一次從數據庫加載數據後,然後緩存到一個地方,下一次訪問的時候就直接返回緩存中的結果就好,這樣可以提高服務器的響應效率。緩存Filter工作流程一般爲:

a、獲取瀏覽器提交的request。

b、如果request爲POST方式,則不經過緩存。

c、如果request爲GET方式,且請求的頁面有緩存並且緩存沒有過期,則直接返回緩存結果,這樣就避免了讀取數據庫。

d、如果沒有緩存或緩存過期則重新請求Servlet,將Servlet返回的內容緩存並輸出到客戶端瀏覽器。


發佈了109 篇原創文章 · 獲贊 39 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章