Servlet 3.0+ 引入 @WebFilter 註解,徹底替代 web.xml 中繁瑣的 <filter>、<filter-mapping> 配置。本文系統講解 Filter 概念、三大核心方法、註解屬性表、以及統一認證、編碼轉換、數據加密等實戰場景代碼。
init(FilterConfig config):初始化,讀取初始化參數。doFilter(ServletRequest req, ServletResponse resp, FilterChain chain):核心邏輯,**必須調用 chain.doFilter(req, resp) 傳遞給下一個過濾器或目標資源**,否則請求截斷。destroy():銷毀釋放資源。| 屬性名 | 類型 | 說明 | 等價 XML |
|---|---|---|---|
| filterName | String | 過濾器名稱 | <filter-name> |
| value | String[] | URL 匹配模式(與 urlPatterns 二選一) | <url-pattern> |
| urlPatterns | String[] | URL 匹配模式(與 value 二選一) | <url-pattern> |
| servletNames | String[] | 應用於哪些 Servlet(@WebServlet 的 name 或 <servlet-name>) | <servlet-name> |
| dispatcherTypes | DispatcherType[] | 轉發模式:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST(默認 REQUEST) | <dispatcher> |
| initParams | WebInitParam[] | 初始化參數數組 | <init-param> |
| asyncSupported | boolean | 是否支持異步操作 | <async-supported> |
| description | String | 描述信息 | <description> |
| displayName | String | 顯示名(工具使用) | <display-name> |
@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(); }
}
request.setCharacterEncoding("UTF-8")、response.setCharacterEncoding("UTF-8")。HttpServletRequestWrapper 重寫 getParameter 進行 HTML 轉義。HttpServletResponseWrapper 輸出流接入 GZIP。doFilter 中校驗 timestamp、nonce、signature。多個 Filter 時,urlPatterns 匹配順序決定調用鏈順序;若需強制排序,可在 web.xml 中顯式配置 <filter-mapping> 順序(註解無 order 屬性)。
@WebFilter 讓過濾器配置類型安全、重構友好、零 XML。掌握其屬性與生命周期,能快速實現認證、編碼、安全、監控等橫切關注點,是 Servlet 開發必備技能。