Servlet
和 Filter
是 Java Web 開發中常用的兩種元件,但它們的功能和使用場景不同。以下是它們的主要區別:
1. 作用和用途
-
Servlet:
Servlet
是處理客戶端請求和生成響應的主要元件。它可以直接處理 HTTP 請求,生成動態內容,並將響應返回給客戶端。Servlet 通常用於實現應用的核心業務邏輯,如請求處理、資料處理和返回結果等。 -
Filter:
Filter
主要用於在請求到達Servlet
之前或響應返回給客戶端之前對其進行攔截和處理。Filter
的作用是對請求或響應進行預處理或後處理,不直接生成響應內容。典型用途包括身份驗證、日誌記錄、編碼轉換、壓縮和解壓縮等。
2. 執行順序和生命週期
-
Servlet:
Servlet
的生命週期由 Tomcat 等 Servlet 容器管理。當客戶端請求到達指定的 URL 時,Servlet
被呼叫,並根據業務邏輯生成響應。每次請求都會觸發service()
方法,常見的生命週期方法包括init()
、service()
和destroy()
。 -
Filter:
Filter
的執行在Servlet
之前和之後,作為請求-響應鏈的一部分。Filter 先對請求進行預處理,然後將請求轉發給Servlet
,最終在響應生成後再對響應進行處理。Filter 的生命週期也由容器管理,常見方法包括init()
、doFilter()
和destroy()
。
3. 配置方式
-
Servlet:
Servlet
可以透過web.xml
檔案或使用@WebServlet
註解配置 URL 對映。每個Servlet
只能對映到指定的 URL 路徑上,通常用來直接處理該 URL 的請求。@WebServlet("/exampleServlet") public class ExampleServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 處理請求 } }
-
Filter:
Filter
可以透過web.xml
檔案或@WebFilter
註解配置,應用於多個Servlet
、JSP
或 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. 執行機制和效能影響
-
Servlet:
Servlet
只在處理指定的 URL 請求時執行,因此不會對其他請求產生額外的效能影響。 -
Filter:
Filter
可以在多個Servlet
前後進行攔截,因此它對指定 URL 請求之外的請求可能會產生額外的效能開銷。為保證效能,儘量只在需要的 URL 路徑上應用Filter
。
6. 總結
特性 | Servlet | Filter |
---|---|---|
作用 | 處理請求並生成響應 | 請求和響應的預處理與後處理 |
執行順序 | 直接響應客戶端請求 | 請求鏈中的一部分,在 Servlet 前後執行 |
生命週期管理 | init() 、service() 、destroy() |
init() 、doFilter() 、destroy() |
配置方式 | @WebServlet 或 web.xml |
@WebFilter 或 web.xml |
適用場景 | 核心業務邏輯處理 | 身份驗證、日誌記錄、加密等預處理和後處理 |
效能影響 | 無額外開銷 | 多個 Filter 可能對效能產生影響 |
總結而言,Servlet
是直接處理請求的元件,而 Filter
是在請求到達 Servlet
之前或響應返回客戶端之前執行的“攔截器”,主要用於處理請求和響應的預處理或後處理。