
- JSP 基礎教程
- JSP - 首頁
- JSP - 概述
- JSP - 環境搭建
- JSP - 架構
- JSP - 生命週期
- JSP - 語法
- JSP - 指令
- JSP - 動作
- JSP - 隱式物件
- JSP - 客戶端請求
- JSP - 伺服器響應
- JSP - HTTP 狀態碼
- JSP - 表單處理
- JSP - 編寫過濾器
- JSP - Cookie 處理
- JSP - 會話跟蹤
- JSP - 檔案上傳
- JSP - 處理日期
- JSP - 頁面重定向
- JSP - 訪問計數器
- JSP - 自動重新整理
- JSP - 傳送郵件
- 高階 JSP 教程
- JSP - 標準標籤庫
- JSP - 資料庫訪問
- JSP - XML 資料
- JSP - JavaBean
- JSP - 自定義標籤
- JSP - 表示式語言
- JSP - 異常處理
- JSP - 除錯
- JSP - 安全
- JSP - 國際化
- JSP 有用資源
- JSP - 常見問題解答
- JSP - 快速指南
- JSP - 有用資源
- JSP - 討論
JSP - 過濾器
在本章中,我們將討論 JSP 中的過濾器。Servlet 和 JSP 過濾器是 Java 類,可以在 Servlet 和 JSP 程式設計中用於以下目的:
攔截來自客戶端的請求,在它們訪問後端資源之前。
在伺服器將響應傳送回客戶端之前,操縱伺服器的響應。
規範建議了各種型別的過濾器:
- 身份驗證過濾器
- 資料壓縮過濾器
- 加密過濾器
- 觸發資源訪問事件的過濾器
- 影像轉換過濾器
- 日誌記錄和審計過濾器
- MIME 型別鏈過濾器
- 標記化過濾器
- 轉換 XML 內容的 XSL/T 過濾器
過濾器部署在部署描述符檔案web.xml中,然後對映到應用程式部署描述符中的 servlet 或 JSP 名稱或 URL 模式。部署描述符檔案 web.xml 可以在<Tomcat 安裝目錄>\conf目錄中找到。
當 JSP 容器啟動您的 Web 應用程式時,它會建立您在部署描述符中宣告的每個過濾器的例項。過濾器按其在部署描述符中宣告的順序執行。
Servlet 過濾器方法
過濾器只是一個實現javax.servlet.Filter介面的 Java 類。javax.servlet.Filter 介面定義了三個方法:
序號 | 方法及描述 |
---|---|
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) 每次由於客戶端對鏈末端資源的請求而透過鏈傳遞請求/響應對時,容器都會呼叫此方法。 |
2 | public void init(FilterConfig filterConfig) Web 容器呼叫此方法以指示過濾器已投入使用。 |
3 | public void destroy() Web 容器呼叫此方法以指示過濾器即將停止使用。 |
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 安裝目錄>/webapps/ROOT/WEB-INF/classes。
Web.xml 中的 JSP 過濾器對映
過濾器被定義,然後對映到 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>
過濾器應用順序
web.xml 中的 filter-mapping 元素的順序決定了 Web 容器將過濾器應用於 servlet 或 JSP 的順序。要反轉過濾器的順序,您只需要反轉web.xml檔案中 filter-mapping 元素的順序即可。
例如,上面的示例將首先應用 LogFilter,然後將其應用於任何 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>