Filter 與 Servlet 的區別

gongchengship發表於2024-10-28

ServletFilter 是 Java Web 開發中常用的兩種元件,但它們的功能和使用場景不同。以下是它們的主要區別:

1. 作用和用途

  • ServletServlet 是處理客戶端請求和生成響應的主要元件。它可以直接處理 HTTP 請求,生成動態內容,並將響應返回給客戶端。Servlet 通常用於實現應用的核心業務邏輯,如請求處理、資料處理和返回結果等。

  • FilterFilter 主要用於在請求到達 Servlet 之前或響應返回給客戶端之前對其進行攔截和處理。Filter 的作用是對請求或響應進行預處理或後處理,不直接生成響應內容。典型用途包括身份驗證、日誌記錄、編碼轉換、壓縮和解壓縮等。

2. 執行順序和生命週期

  • ServletServlet 的生命週期由 Tomcat 等 Servlet 容器管理。當客戶端請求到達指定的 URL 時,Servlet 被呼叫,並根據業務邏輯生成響應。每次請求都會觸發 service() 方法,常見的生命週期方法包括 init()service()destroy()

  • FilterFilter 的執行在 Servlet 之前和之後,作為請求-響應鏈的一部分。Filter 先對請求進行預處理,然後將請求轉發給 Servlet,最終在響應生成後再對響應進行處理。Filter 的生命週期也由容器管理,常見方法包括 init()doFilter()destroy()

3. 配置方式

  • ServletServlet 可以透過 web.xml 檔案或使用 @WebServlet 註解配置 URL 對映。每個 Servlet 只能對映到指定的 URL 路徑上,通常用來直接處理該 URL 的請求。

    @WebServlet("/exampleServlet")
    public class ExampleServlet extends HttpServlet {
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 處理請求
        }
    }
    
  • FilterFilter 可以透過 web.xml 檔案或 @WebFilter 註解配置,應用於多個 ServletJSP 或 URL 路徑模式。可以在 Filter 中設定匹配規則,使其攔截特定的 URL 或資源請求。

    @WebFilter("/exampleServlet")
    public class ExampleFilter implements Filter {
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            // 前置處理
            chain.doFilter(request, response); // 繼續呼叫下一個 Filter 或 Servlet
            // 後置處理
        }
    }
    

4. 常見用途

  • Servlet:適合用於核心業務邏輯、響應生成和資源處理。例如,處理使用者登入、處理表單提交、返回 JSON 資料等。

  • Filter:適合用於請求和響應的通用處理。例如:

    • 身份驗證和授權:在請求到達 Servlet 之前檢查使用者是否登入或有許可權。
    • 日誌記錄:記錄請求的詳細資訊(IP 地址、請求時間等)。
    • 資料加密和解密:對請求資料進行加密,對響應資料進行解密。
    • 編碼設定:確保請求和響應都使用正確的字元編碼。

5. 執行機制和效能影響

  • ServletServlet 只在處理指定的 URL 請求時執行,因此不會對其他請求產生額外的效能影響。

  • FilterFilter 可以在多個 Servlet 前後進行攔截,因此它對指定 URL 請求之外的請求可能會產生額外的效能開銷。為保證效能,儘量只在需要的 URL 路徑上應用 Filter

6. 總結

特性 Servlet Filter
作用 處理請求並生成響應 請求和響應的預處理與後處理
執行順序 直接響應客戶端請求 請求鏈中的一部分,在 Servlet 前後執行
生命週期管理 init()service()destroy() init()doFilter()destroy()
配置方式 @WebServletweb.xml @WebFilterweb.xml
適用場景 核心業務邏輯處理 身份驗證、日誌記錄、加密等預處理和後處理
效能影響 無額外開銷 多個 Filter 可能對效能產生影響

總結而言,Servlet 是直接處理請求的元件,而 Filter 是在請求到達 Servlet 之前或響應返回客戶端之前執行的“攔截器”,主要用於處理請求和響應的預處理或後處理。

相關文章