在開發 Java Web 應用程式時,權限控管是不可或缺的環節。本文將示範如何使用 Servlet Filter 搭配 Struts2 框架,實作簡單的路徑攔截機制,保護特定頁面不被未登入用戶存取。
首先在 web.xml 中定義過濾器與對應的 URL 模式,此處採用 /* 攔截所有請求:
<filter> <filter-name>UsersFilter</filter-name> <filter-class>com.web.UsersFilter</filter-class> </filter> <filter-mapping> <filter-name>UsersFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
建立 com.web.UsersFilter 實作 javax.servlet.Filter 介面,核心邏輯在 doFilter 方法中:
package com.web;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
public class UsersFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 統一字元編碼
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
HttpSession session = req.getSession();
// 取得 Session 中的用戶物件
Object user = session.getAttribute("user");
// 取得當前請求 URI
String url = req.getRequestURI();
// 若用戶未登入,且請求非公開頁面,則放行並設定快取控制
if (user == null
&& url.indexOf("test.jsp") < 0
&& url.indexOf("comment.jsp") < 0
&& url.indexOf("link.jsp") < 0) {
chain.doFilter(request, response);
res.setHeader("Cache-Control", "no-store");
res.setDateHeader("Expires", 0);
res.setHeader("Pragma", "no-cache");
res.flushBuffer();
}
}
public void destroy() { }
public void init(FilterConfig arg0) throws ServletException { }
}
session.getAttribute("user") 確認登入狀態。test.jsp、comment.jsp、link.jsp 為公開頁面,不需登入即可存取。no-store、Expires=0、Pragma=no-cache,防止瀏覽器快取敏感頁面。實務上建議將白名單路徑集中管理(如存放於資料庫或設定檔),並搭配 Struts2 的攔截器機制進行更細緻的權限控管,提升系統彈性與安全性。
