Filter過濾器
簡介
filter可以認為是servlet的一種加強版换薄,主要用于對用戶請求request進行預處理毒涧,也可以對response進行后處理副签,是個典型的處理鏈论衍。使用filter的完整流程是,filter對用戶請求進行預處理楣责,接著將請求HttpServletRequest交給Servlet處理并生成響應竣灌。最后Filter再對服務器響應HttpServletResponse進行后處理聂沙。Servlet與Servlet具有完全相同的生命周期,而Filter也可以通過<<init-para>init-para>進行初始化參數(shù)的配置初嘹,并通過FilterConfig傳送給filter
創(chuàng)建Filter過濾器的兩步
創(chuàng)建一個Filter只需兩步
- 創(chuàng)建Filter處理類及汉,即實現(xiàn)javax.servlet.Filter接口
- web.xml文件中配置filter
javax.servlet.Filter接口介紹
Filter必須實現(xiàn)javax.servlet.Filter接口,在該接口中定義了三個方法
-
void init(FilterConfig config)
:用于Filter的初始化屯烦,F(xiàn)ilterConfig用于訪問Filter的配置信息 -
void destroy()
:用于Filter銷毀前坷随,某些資源的釋放回收
*void doFilter(ServletRequest request,ServletResponse response驻龟,F(xiàn)ilterChain chain)
:實現(xiàn)過濾功能的核心方法温眉,該方法是對每個請求及響應增加額外的處理,該方法實現(xiàn)對用戶請求request進行預處理翁狐,也可以實現(xiàn)對服務器響應response進行后處理---它們的分界線為是否調(diào)用了chain.doFilter(request类溢,response)
,執(zhí)行該方法之前露懒,即對用戶請求request進行預處理闯冷,執(zhí)行該方法之后,即對服務器響應response進行后處理懈词。
web.xml配置介紹
<filter-name>用于為過濾器指定一個名字蛇耀,該元素的內(nèi)容不能為空。
<filter-class>元素用于指定過濾器的完整的限定類名坎弯。
<init-param>元素用于為過濾器指定初始化參數(shù)纺涤,它的子元素<param-name>指定參數(shù)的名字,<param-value>指定參數(shù)的值抠忘。
在過濾器中撩炊,可以使用FilterConfig接口對象來訪問初始化參數(shù)。
<filter-mapping>元素用于設置一個 Filter 所負責攔截的資源褐桌。一個Filter攔截的資源可通過兩種方式來指定:Servlet 名稱和資源訪問的請求路徑
<filter-name>子元素用于設置filter的注冊名稱。該值必須是在<filter>元素中聲明過的過濾器的名字
<url-pattern>設置 filter 所攔截的請求路徑(過濾器關聯(lián)的URL樣式)
<servlet-name>指定過濾器所攔截的Servlet名稱象迎。
<dispatcher>指定過濾器所攔截的資源被 Servlet 容器調(diào)用的方式荧嵌,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默認REQUEST砾淌。用戶可以設置多個<dispatcher> 子元素用來指定 Filter 對資源的多種調(diào)用方式進行攔截啦撮。
<dispatcher> 子元素可以設置的值及其意義:
REQUEST:當用戶直接訪問頁面時,Web容器將會調(diào)用過濾器汪厨。如果目標資源是通過RequestDispatcher的include()或forward()方法訪問時赃春,那么該過濾器就不會被調(diào)用。
INCLUDE:如果目標資源是通過RequestDispatcher的include()方法訪問時劫乱,那么該過濾器將被調(diào)用织中。除此之外锥涕,該過濾器不會被調(diào)用。
FORWARD:如果目標資源是通過RequestDispatcher的forward()方法訪問時狭吼,那么該過濾器將被調(diào)用层坠,除此之外,該過濾器不會被調(diào)用刁笙。
ERROR:如果目標資源是通過聲明式異常處理機制調(diào)用時破花,那么該過濾器將被調(diào)用。除此之外疲吸,過濾器不會被調(diào)用座每。
Filters使用案例
Example1:自己對相應業(yè)務寫一個實現(xiàn)Filter接口的類
<!-- 請求url日志記錄過濾器 -->
<filter>
<filter-name>logfilter</filter-name>
<filter-class>com.weijia.filterservlet.LogFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>logfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
package com.weijia.filterservlet;
import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
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 EncodingFilter implements Filter {
private String encoding;
private HashMap<String,String> params = new HashMap<String,String>();
// 項目結束時就已經(jīng)進行銷毀
public void destroy() {
System.out.println("end do the encoding filter!");
params=null;
encoding=null;
}
public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {
System.out.println("before encoding " + encoding + " filter!");
req.setCharacterEncoding(encoding);
chain.doFilter(req, resp);
System.out.println("after encoding " + encoding + " filter摘悴!");
System.err.println("----------------------------------------");
}
// 項目啟動時就已經(jīng)進行讀取
public void init(FilterConfig config) throws ServletException {
System.out.println("begin do the encoding filter!");
encoding = config.getInitParameter("encoding");
for (Enumeration<?> e = config.getInitParameterNames(); e.hasMoreElements();) {
String name = (String) e.nextElement();
String value = config.getInitParameter(name);
params.put(name, value);
}
}
}
Example2:防止中文亂碼過濾器
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name><!--用來指定一個具體的字符集-->
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name><!--true:無論request是否指定了字符集峭梳,都是用encoding;false:如果request已指定一個字符集烦租,則不使用encoding-->
<param-value>false</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>