攔截所有 Web 資源(JSP、Servlet、靜態文件),實現:權限控制、敏感詞過濾、編碼統一、壓縮響應、日誌記錄、XSS 防護等橫切關注點。
容器啟動實例化 Filter → init() → 每次請求調用 doFilter(req, resp, chain) → 開發者決定是否 chain.doFilter() 放行 → destroy() 銷毀。
@WebFilter("/*")
public class EncodingFilter implements Filter {
private String encoding = "UTF-8";
@Override public void init(FilterConfig cfg) { encoding = cfg.getInitParameter("encoding"); }
@Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
req.setCharacterEncoding(encoding);
resp.setContentType("text/html;charset=" + encoding);
chain.doFilter(req, resp); // 放行
}
@Override public void destroy() {}
}
按 web.xml 或 @WebFilter 聲明順序:Filter1→Filter2→...→Target Resource。任一 Filter 不調用 chain.doFilter() 即阻斷鏈。
init() 僅執行一次doFilter()destroy() 釋放資源<filter> <filter-name>AuthFilter</filter-name> <filter-class>com.demo.AuthFilter</filter-class> <init-param><param-name>excludedPaths</param-name><param-value>/login,/register</param-value></init-param> </filter> <filter-mapping><filter-name>AuthFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
public void init(FilterConfig cfg) {
String paths = cfg.getInitParameter("excludedPaths");
// 解析為 Set 供 doFilter 判斷放行
}
| 元素 | 說明 |
|---|---|
| <url-pattern> | 路徑匹配:/api/*、/*.jsp、/exact/path |
| <servlet-name> | 按 Servlet 名稱攔截 |
| <dispatcher> | REQUEST(默認)、FORWARD、INCLUDE、ERROR、ASYNC |
多 <dispatcher> 可組合,如同時攔截直接訪問與轉發:
<filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>