Java Servlet 過濾器


在請求的預處理和後處理階段都使用的物件是過濾器,輸入驗證、伺服器端日誌記錄、身份驗證和許可權等任務通常使用過濾器進行過濾。

由於 servlet 是可插拔的,因此條目在 web.xml 檔案中提供。如果從 web.xml 檔案中刪除該條目,則過濾器將自動停用。為了建立過濾器,它必須實現 javax.servlet。Servlet 非常便攜,因為它們是用高度便攜的 Java 語言構建的,並遵循標準基礎。因此,它使得能夠在彼此獨立的作業系統和伺服器中開發複雜的伺服器擴充套件。

為什麼我們需要 Servlet 過濾器?

Servlet 過濾器有很多功能。下面列出了一些功能:

  • 伺服器上的日誌記錄

  • 日誌檔案記錄請求引數資訊

  • 伺服器上的身份驗證和授權

  • 檔案壓縮和解壓縮

  • 加密和解密都是不同的過程

  • 伺服器上的驗證

Servlet 過濾器的優點

以下是 Servlet 過濾器的功能:

  • 可以插入

  • 過濾器不依賴於第三方資源

  • 維護成本低

  • 廣泛使用

Servlet 過濾器方法

它包含 3 個生命週期方法

方法

描述

public void init(FilterConfig config) throws ServletException

為了通知正在投入服務的過濾器,這激活了 Web 容器。它只需要 FilterConfig 型別或 FilterConfig 物件作為引數。

public void doFilters(ServletRequest request,ServletResponse response,FileterChain chain) throws ServletException,IOException

每次使用者請求對映到過濾器的資源時,都會呼叫 dofilter() 方法。它具有過濾功能。

public void destroy ()

此函式僅在過濾器從服務中移除時才呼叫一次。

示例

在本例中,我們將建立一個名為 index.html 的網頁,其中包含一個連結,上面寫著“點選此處”。透過點選連結來呼叫 servlet “ServletFilter.java”,但是,與該 Servlet 關聯的部署描述符中指定的過濾器“MyFilter.java”將首先執行。

Index.html

示例

<html>
   <head>
      <title>HttpSession Event Listeners</title>
   </head>
   <body>
      <a href="ServletFilter">click here</a>
   </body>
</html>

ServletFilter.java

示例

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class ServletFilter extends HttpServlet {
   public void doGet(HttpServletRequest request,
      HttpServletResponse response)
      throws ServletException, IOException {
         response.setContentType("text/html");
         PrintWriter out = response.getWriter();
         out.print(
            "<br>welcome to servlet filter example<br>");
      }
}

MyFilter.java

示例

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.*;
public class MyFilter implements Filter {
   FilterConfig config;
   public void init(FilterConfig config)
      throws ServletException {
      this.config = config;
   }
   public void doFilter(ServletRequest req,
                        ServletResponse resp,
                        FilterChain chain)
   throws IOException, ServletException {
      PrintWriter out = resp.getWriter();
      String s = config.getInitParameter("construction");
      if (s.equals("yes")) {
         out.print("This page is under construction");
      } else {
         // sends request to next resource
         chain.doFilter(req, resp);
      }
   }
   public void destroy() {}
}

Web.xml

示例

<?xml version="1.0" encoding="UTF-8"?>
<web-app
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://xmlns.jcp.org/xml/ns/javaee"
   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
   http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
   id="WebApp_ID" version="4.0">
   <servlet>
      <servlet-name>ServletFilter</servlet-name>
      <servlet-class>ServletFilter</servlet-class>
   </servlet>
   <servlet-mapping>
      <servlet-name>ServletFilter</servlet-name>
      <url-pattern>/ServletFilter</url-pattern>
   </servlet-mapping>
   <filter>
      <filter-name>f1</filter-name>
      <filter-class>MyFilter</filter-class>
      <init-param>
         <param-name>construction</param-name>
         <param-value>no</param-value>
      </init-param>
   </filter>
   <filter-mapping>
      <filter-name>f1</filter-name>
      <url-pattern>/servlet1</url-pattern>
   </filter-mapping>
</web-app>

輸出

  • 步驟 1 - 點選“點選此處”

  • 步驟 2 - 如果點選以下連結,將彈出此訊息

結論

在請求處理領域,過濾器是必不可少的元件,在請求處理之前和之後都發揮著重要作用。重要的是,過濾器被廣泛用於各種任務,包括但不限於驗證使用者輸入;記錄伺服器端活動;提供身份驗證或授權服務。在 servlet 技術的上下文中,由於它是可插拔的,因此可以透過適當地配置 web.xml 檔案來優雅地引入過濾器。如果出於任何原因需要快速停用此檔案中與這些過濾器相關的任何條目,則刪除將立即產生這種效果。為了讓開發人員能夠在此技術框架內建立過濾器並享受其在不同情況和不同伺服器環境中的可移植性優勢;javavax.servlet 實現至關重要,因為它是其唯一的構建塊。不用說,與其他具有某種程度的相容性問題的類似技術(可能由於程式語言差異等原因)不同。servlet 中固有的可移植性使它們非常適合跨各種平臺部署複雜的伺服器擴充套件,而不管型別如何。

更新於: 2023年8月1日

652 次瀏覽

啟動您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.