Servlet Filter(過濾器)能在請求到達 Servlet/JSP 前、響應返回客戶端前插入邏輯,完美解決多頁面共性需求:
File → New → Web → Filter Servlet 啟動向導。LoginCheckFilter,包:bookstore.servlet。/*(攔截所有請求),Filter Name:logincheckfilter。package bookstore.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class LoginCheckFilter implements Filter {
private FilterConfig filterConfig;
@Override
public void init(FilterConfig config) {
this.filterConfig = config;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
String uri = req.getRequestURI().toUpperCase();
boolean isLoginPage = uri.contains("LOGIN.JSP") || uri.contains("SWITCH.JSP");
boolean isLoggedIn = req.getSession().getAttribute("ses_userBean") != null;
// 登錄頁或已登錄 → 放行
if (isLoginPage || isLoggedIn) {
chain.doFilter(request, response);
} else {
// 未登錄 → 重定向至登錄頁
resp.sendRedirect(req.getContextPath() + "/login.jsp");
}
}
@Override
public void destroy() {
this.filterConfig = null;
}
}
sendRedirect:客戶端跳轉,地址欄變化,避免表單重複提交。req.getContextPath() 確保部署路徑變更不影響。ServletException/IOException 記錄日誌,不拋出避免中斷鏈路。public class EncodingFilter implements Filter {
private String encoding = "UTF-8";
private boolean forceEncoding = true;
@Override
public void init(FilterConfig config) {
String enc = config.getInitParameter("encoding");
if (enc != null) encoding = enc;
String force = config.getInitParameter("forceEncoding");
if (force != null) forceEncoding = Boolean.parseBoolean(force);
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
if (forceEncoding || req.getCharacterEncoding() == null) {
req.setCharacterEncoding(encoding);
}
if (forceEncoding || resp.getCharacterEncoding() == null) {
resp.setCharacterEncoding(encoding);
}
chain.doFilter(req, resp);
}
}
web.xml 配置:
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>bookstore.servlet.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Filter 是 Java Web 架構中實現 AOP 風格橫切關注點的輕量級利器。善用 Filter 可大幅減少重複代碼,提升系統安全性、可維護性與一致性。JBuilder 等 IDE 的向導能加速樣板代碼生成,但核心邏輯仍需開發者深入理解 Servlet API 與 HTTP 協議。