Servlet過濾器是Java類,可用於Servlet編程用於以下目的:
為了攔截來自客戶端的請求訪問後端資源之前。
處理來自服務器的響應之前,將他們發送回客戶端。
各種類型的規範建議要通過過濾器:
過濾器被部署在部署描述符文件web.xml,然後映射到您的應用程序的部署描述符是servlet的名稱或URL模式。
當Web容器啟動Web應用程序,它在部署描述符中聲明的每一個過濾器,創建一個實例。該過濾器執行的順序是由他們在部署描述符中聲明。
過濾器是一個簡單的Java類,實現了javax.servlet.Filter接口。 javax.servlet.Filter接口定義了三個方法:
S.N. | Method & Description |
---|---|
1 |
public void doFilter (ServletRequest, ServletResponse, FilterChain) 這種方法被稱為由容器每次鏈由於資源的客戶機請求在鏈的末端通過一個請求/響應對。 |
2 |
public void init(FilterConfig filterConfig) 這種方法被稱為由Web容器,以指示一個過濾器,它被放入服務。 |
3 |
public void destroy() 這種方法被稱為由Web容器,一個過濾器,以指示它正被取出的服務。 |
以下是Servlet過濾器的示例將打印出客戶端的IP地址和當前日期時間。這個例子給你基本的了解,Servlet過濾器,但你可以編寫更複雜的過濾器的應用程序使用相同的概念:
// Import required java libraries import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; // Implements Filter class - by www.gitbook.net public class LogFilter implements Filter { public void init(FilterConfig config) throws ServletException{ // Get init parameter String testParam = config.getInitParameter("test-param"); //Print the init parameter System.out.println("Test Param: " + testParam); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException { // Get the IP address of client machine. String ipAddress = request.getRemoteAddr(); // Log the IP address and current timestamp. System.out.println("IP "+ ipAddress + ", Time " + new Date().toString()); // Pass request back down the filter chain chain.doFilter(request,response); } public void destroy( ){ /* Called before the Filter instance is removed from service by the web container*/ } }
在通常的方式,把你的類文件中的LogFilter.java編譯並把LogFilter.class放到<Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes.
定義過濾器,然後映射到一個URL或Servlet,在大致相同的方式作為Servlet的定義,然後映射到一個URL模式。在部署描述符文件web.xml中的過濾器標簽,創建下麵的條目
<filter> <filter-name>LogFilter</filter-name> <filter-class>LogFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value>Initialization Paramter</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
上述過濾器適用於所有的servlet,因為我們指定/ *在我們的配置。您可以指定一個特定的servlet的路徑,如果你想申請隻有少數的servlet過濾器。
現在試著調用任何servlet中常用的方法,將會看到在Web服務器日誌生成的日誌。也可以使用Log4J上麵的日誌記錄器來記錄到一個單獨的文件。
Web應用程序可以定義若乾個不同的過濾器與一個特定的目的。考慮一下,如果定義了兩個的過濾器AuthenFilter和LogFilter。除非需要創建不同的映射,其餘的過程將繼續如上文所述,如下文所述:
<filter> <filter-name>LogFilter</filter-name> <filter-class>LogFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value>Initialization Paramter</param-value> </init-param> </filter> <filter> <filter-name>AuthenFilter</filter-name> <filter-class>AuthenFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value>Initialization Paramter</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>AuthenFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
過濾器-映射元素在web.xml中的順序確定的順序的Web容器的servlet過濾器。若要反轉過濾器的順序,你隻需要在web.xml文件中反轉過濾器-映射元素。
例如,上麵的例子中,將適用於LogFilter第一個位置,那麼這將適用於AuthenFilter任何servlet,但下麵的例子將順序顛倒:
<filter-mapping> <filter-name>AuthenFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>