實現一個 Servlet 過濾器
1. 編寫實現類的程序
過濾器 API 包含 3 個簡單的接口(又是數字 3!),它們整潔地嵌套在 javax.servlet 包中。那 3 個接口分別是 Filter 、 FilterChain 和 FilterConfig 。從編程的角度看,過濾器類將實現 Filter 接口,然后使用這個過濾器類中的 FilterChain 和 FilterConfig 接口。該過濾器類的一個引用將傳遞給 FilterChain 對象,以允許過濾器把控制權傳遞給鏈中的下一個資源。 FilterConfig 對象將由容器提供給過濾器,以允許訪問該過濾器的初始化數據。
為了與我們的三步模式保持一致,過濾器必須運用三個方法,以便完全實現 Filter 接口:
init() :這個方法在容器實例化過濾器時被調用,它主要設計用于使過濾器為處理做準備。該方法接受一個 FilterConfig 類型的對象作為輸入。
doFilter() :與 servlet 擁有一個 service() 方法(這個方法又調用 doPost() 或者 doGet() )來處理請求一樣,過濾器擁有單個用于處理請求和響應的方法―― doFilter() 。這個方法接受三個輸入參數:一個 ServletRequest 、 response 和一個 FilterChain 對象。
destroy() :正如您想像的那樣,這個方法執行任何清理操作,這些操作可能需要在自動垃圾收集之前進行。
清單 1 展示了一個非常簡單的過濾器,它跟蹤滿足一個客戶機的 Web 請求所花的大致時間。
清單 1. 一個過濾器類實現
import javax.servlet.*;
import java.util.*;
import java.io.*;
public class TimeTrackFilter implements Filter {
???? private FilterConfig filterConfig = null;
???? public void init(FilterConfig filterConfig)
??????? throws ServletException {
??????? this.filterConfig = filterConfig;
???? }
???? public void destroy() {
??????? this.filterConfig = null;
???? }
???? public void doFilter( ServletRequest request,
??????? ServletResponse response, FilterChain chain )
??????? throws IOException, ServletException {
??????? Date startTime, endTime;
??????? double totalTime;
??????? startTime = new Date();
??????? // Forward the request to the next resource in the chain
??????? chain.doFilter(request, wrapper);
??????? // -- Process the response -- \\
??????? // Calculate the difference between the start time and end time
??????? endTime = new Date();
??????? totalTime = endTime.getTime() - startTime.getTime();
??????? totalTime = totalTime / 1000; //Convert from milliseconds to seconds
??????? StringWriter sw = new StringWriter();
??????? PrintWriter writer = new PrintWriter(sw);
??????? writer.println();
??????? writer.println("===============");
??????? writer.println("Total elapsed time is: " + totalTime + " seconds." );
??????? writer.println("===============");
??????? // Log the resulting string
??????? writer.flush();
??????? filterConfig.getServletContext().
?????????? log(sw.getBuffer().toString());
???? }
}