Filter 可在請求到達 Servlet/JSP 前、響應返回瀏覽器前攔截處理。本文示範建立 LoginCheckFilter 實現全站登入驗證,並列舉編碼轉換、統一頁首尾等典型應用場景。
File → New → Web → Filter ServletLoginCheckFilter,Package: bookstore.servlet/*(攔截所有請求)Finishpublic class LoginCheckFilter extends HttpServlet implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
try {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
String uri = request.getRequestURI().toUpperCase();
boolean isLoginPage = uri.indexOf("LOGIN.JSP") != -1;
boolean isSwitchPage = uri.indexOf("SWITCH.JSP") != -1;
boolean hasUser = request.getSession().getAttribute("ses_userBean") != null;
if (!isLoginPage && !isSwitchPage && !hasUser) {
response.sendRedirect("/webModule/login.jsp"); // 未登入 → 導向登入頁
} else {
chain.doFilter(request, response); // 放行
}
} catch (ServletException | IOException e) {
filterConfig.getServletContext().log(e.getMessage());
}
}
}
<filter>
<filter-name>logincheckfilter</filter-name>
<filter-class>bookstore.servlet.LoginCheckFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>logincheckfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
不同伺服器/OS/資料庫預設編碼不同,Filter 統一在請求進入前設定:
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
響應返回前注入共用 HTML 片段,避免每頁重複。
Session 檢查 ses_userBean,未登入強制導向 login.jsp。排除登入頁與處理頁避免無限迴圈。
chain.doFilter())。web.xml 宣告順序決定執行順序。url-pattern 避開 *.css/*.js/*.jpg,或用 DispatcherType 限制。