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返回的內容緩存並輸出到客戶端瀏覽器。