更新時間:2020-08-25 13:10:06 來源:動力節(jié)點 瀏覽1312次
JSP過濾器大家應該都有有所了解,在JSP入門教程當中就有相關教程。
JSP 和 Servlet 中的過濾器都是 Java 類。
過濾器可以動態(tài)地攔截請求和響應,以變換或使用包含在請求或響應中的信息。
可以將一個或多個過濾器附加到一個 Servlet 或一組 Servlet。過濾器也可以附加到 JavaServer Pages (JSP) 文件和 HTML 頁面。
過濾器是可用于 Servlet 編程的 Java 類,可以實現(xiàn)以下目的:
? 在客戶端的請求訪問后端資源之前,攔截這些請求。
? 在服務器的響應發(fā)送回客戶端之前,處理這些響應。
根據(jù)規(guī)范建議的各種類型的過濾器:
? 身份驗證過濾器(Authentication Filters)。
? 數(shù)據(jù)壓縮過濾器(Data compression Filters)。
? 加密過濾器(Encryption Filters)。
? 觸發(fā)資源訪問事件過濾器。
? 圖像轉換過濾器(Image Conversion Filters)。
? 日志記錄和審核過濾器(Logging and Auditing Filters)。
? MIME-TYPE 鏈過濾器(MIME-TYPE Chain Filters)。
? 標記化過濾器(Tokenizing Filters)。
? XSL/T 過濾器(XSL/T Filters),轉換 XML 內容。
過濾器通過 Web 部署描述符(web.xml)中的 XML 標簽來聲明,然后映射到您的應用程序的部署描述符中的 Servlet 名稱或 URL 模式。
當 Web 容器啟動 Web 應用程序時,它會為您在部署描述符中聲明的每一個過濾器創(chuàng)建一個實例。
Filter 的執(zhí)行順序與在 web.xml 配置文件中的配置順序一致,一般把 Filter 配置在所有的 Servlet 之前。
以下是 Servlet 過濾器的實例,將輸出網(wǎng)站名稱和地址。本實例讓您對 Servlet 過濾器有基本的了解,您可以使用相同的概念編寫更復雜的過濾器應用程序:
//導入必需的 java 庫 import javax.servlet.*; import java.util.*; //實現(xiàn) Filter 類 public class LogFilter implements Filter { public void init(FilterConfig config) throws ServletException { // 獲取初始化參數(shù) String site = config.getInitParameter("Site"); // 輸出初始化參數(shù) System.out.println("網(wǎng)站名稱: " + site); } public void doFilter(ServletRequest request, ServletResponse response, Filter Chain chain) throws java.io.IOException, ServletException { // 輸出站點名稱 System.out.println("站點網(wǎng)址:http://www.runoob.com"); // 把請求傳回過濾鏈 chain.doFilter(request,response); } public void destroy( ){ /* 在 Filter 實例被 Web 容器從服務移除之前調用 */ } }
DisplayHeader.java 文件代碼如下:
//導入必需的 java 庫 import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet ;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/DisplayHeader") //擴展 HttpServlet 類 public class DisplayHeader extends HttpServlet { // 處理 GET 方法請求的方法 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 設置響應內容類型 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "HTTP Header 請求實例 - 菜鳥教程實例"; String docType = " \n"; out.println(docType + "\n" + "" + title + "\n"+ "\n" + "" + title + "\n" + "\n" + "\n" + "Header 名稱Header 值\n"+ "\n"); Enumeration headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()) { String paramName = (String)headerNames.nextElement(); out.print("" + paramName + "\n"); String paramValue = request.getHeader(paramName); out.println(" " + paramValue + "\n"); } out.println("\n"); } // 處理 POST 方法請求的方法 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
web.xml 中的 filter-mapping 元素的順序決定了 Web 容器應用過濾器到 Servlet 的順序。若要反轉過濾器的順序,您只需要在 web.xml 文件中反轉 filter-mapping 元素即可。
例如,上面的實例將先應用 LogFilter,然后再應用 AuthenFilter,但是下面的實例將顛倒這個順序:
<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>