首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Servlet Filter 注解配置全解析:@WebFilter 屬性詳解與實戰

     編輯:Java 綜合教學

Servlet Filter 註解配置全解析:@WebFilter 完整屬性指南

Servlet 3.0+ 引入 @WebFilter 註解,徹底替代 web.xml 中繁瑣的 <filter>、<filter-mapping> 配置。本文系統講解 Filter 概念、三大核心方法、註解屬性表、以及統一認證、編碼轉換、數據加密等實戰場景代碼。

1. Filter 核心概念與生命周期

  • 定位:請求到達 Servlet 前預處理、響應離開 Servlet 後後處理,構成「過濾器鏈」。
  • 三大方法:
    1. init(FilterConfig config):初始化,讀取初始化參數。
    2. doFilter(ServletRequest req, ServletResponse resp, FilterChain chain):核心邏輯,**必須調用 chain.doFilter(req, resp) 傳遞給下一個過濾器或目標資源**,否則請求截斷。
    3. destroy():銷毀釋放資源。
  • 設計模式:責任鏈模式。

2. @WebFilter 完整屬性表

屬性名類型說明等價 XML
filterNameString過濾器名稱<filter-name>
valueString[]URL 匹配模式(與 urlPatterns 二選一)<url-pattern>
urlPatternsString[]URL 匹配模式(與 value 二選一)<url-pattern>
servletNamesString[]應用於哪些 Servlet(@WebServlet 的 name 或 <servlet-name>)<servlet-name>
dispatcherTypesDispatcherType[]轉發模式:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST(默認 REQUEST)<dispatcher>
initParamsWebInitParam[]初始化參數數組<init-param>
asyncSupportedboolean是否支持異步操作<async-supported>
descriptionString描述信息<description>
displayNameString顯示名(工具使用)<display-name>

3. 實戰:統一登錄認證過濾器

@WebFilter(
    filterName = "AuthFilter",
    urlPatterns = "/*",
    initParams = {
        @WebInitParam(name = "excludedPaths", value = "/login,/static/,/css/,/js/")
    },
    asyncSupported = true
)
public class AuthFilter implements Filter {

    private Set<String> excluded = new HashSet<>();

    @Override
    public void init(FilterConfig config) {
        String paths = config.getInitParameter("excludedPaths");
        if (paths != null) {
            Collections.addAll(excluded, paths.split("\\s*,\\s*"));
        }
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        String uri = request.getRequestURI();
        String ctx = request.getContextPath();

        // 放行排除路徑
        for (String ex : excluded) {
            if (uri.startsWith(ctx + ex)) {
                chain.doFilter(req, resp);
                return;
            }
        }

        // 檢查登錄態
        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute("user") == null) {
            response.sendRedirect(ctx + "/login");
            return;
        }

        chain.doFilter(req, resp);
    }

    @Override
    public void destroy() { excluded.clear(); }
}

4. 其他常見場景

  • 字符編碼過濾器:request.setCharacterEncoding("UTF-8")、response.setCharacterEncoding("UTF-8")。
  • XSS 過濾:包裝 HttpServletRequestWrapper 重寫 getParameter 進行 HTML 轉義。
  • 響應壓縮:包裝 HttpServletResponseWrapper 輸出流接入 GZIP。
  • API 簽名驗證:在 doFilter 中校驗 timestamp、nonce、signature。

5. 執行順序控制

多個 Filter 時,urlPatterns 匹配順序決定調用鏈順序;若需強制排序,可在 web.xml 中顯式配置 <filter-mapping> 順序(註解無 order 屬性)。

總結

@WebFilter 讓過濾器配置類型安全、重構友好、零 XML。掌握其屬性與生命周期,能快速實現認證、編碼、安全、監控等橫切關注點,是 Servlet 開發必備技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved