位置:首頁 > Java技術 > JSP教學 > JSP過濾器

JSP過濾器

Servlet和JSP過濾器是Java類,可用於在Servlet和JSP編程用於以下目的:

  • 攔截來自客戶端請求訪問資源的後端之前。

  • 要從服務器操作的響應,才傳送回客戶端。

有各種各樣的類型的過濾器由規範建議:

  • 驗證過濾器。

  • 數據壓縮過濾器

  • 加密過濾器。

  • 過濾器觸發資源訪問的事件。

  • 圖像轉換過濾器。

  • 日誌記錄和審計的過濾器。

  • MIME類型過濾器鏈。

  • 標記化的過濾器。

  • XSL/ T過濾器,轉換XML內容。

過濾器被部署在部署描述符文件web.xml中,然後映射到任何servlet或在您的應用程序的部署描述符中的JSP名稱或URL模式。部署描述符文件web.xml中可以<Tomcat-installation-directory> conf目錄下找到。

當JSP容器啟動您的Web應用程序,它創建的每個過濾器,您在部署描述符中聲明了一個實例。過濾器因為它們在部署描述符中聲明的順序執行。

Servlet過濾器的方法:

過濾器是一個簡單的實現了javax.servlet.Filter接口的Java類。javax.servlet.Filter接口定義了三個方法:

S.N. 方法 & 描述
1 public void doFilter (ServletRequest, ServletResponse, FilterChain)
This method is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain.
2 public void init(FilterConfig filterConfig)
This method is called by the web container to indicate to a filter that it is being placed into service.
3 public void destroy()
This method is called by the web container to indicate to a filter that it is being taken out of service.

JSP Filter 例子:

以下是JSP的過濾器示例,將每一次訪問任何JSP文件打印的客戶端的IP地址和當前日期時間。這個例子會給你的JSP過濾器基本的了解,但您可以使用相同的概念編寫更複雜的過濾器應用:

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
 
// Implements Filter class
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中。

JSP過濾器映射在web.xml中:

過濾器定義,然後映射到一個URL或JSP文件名,在大致相同的方式為Servlet的定義,然後映射到web.xml文件中的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和JSP,因為我們指定了/*在我們的配置。如果你想應用過濾器上的幾個servlet或JSP的隻有你可以指定一個特定的servlet或JSP路徑。

現在試著調用通常的方式任何servlet或JSP,你會看到生成的日誌在您的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>

Filters Application 順序:

在web.xml中過濾器映射元素的順序決定了Web容器將篩選器應用於servlet或JSP的順序。要反轉過濾器的階數,你隻需要扭轉在web.xml文件中的filter-mapping元素。 

例如,上麵的例子可以先申請LogFilter,然後將適用AuthenFilter任何servlet或JSP,但下麵的例子將顛倒順序:

<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>