開發 Java Web 專案,需依使用者角色(管理員、一般員工、未登入)動態控制資源存取。管理員可操作所有功能,員工僅限部分,未登入者則導向登入頁。
不需將不同權限頁面分置資料夾,只需:
javax.servlet.Filter 的類別(如 AuthFilter)。doFilter() 中從 HttpSession 取得使用者角色,根據請求路徑 (HttpServletRequest.getRequestURI()) 決定是放行、導向登入頁或顯示 403。web.xml 以 <filter-mapping> 攔截所有 *.jsp、/servlet/* 或 /*。public class AuthFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
String uri = request.getRequestURI();
// 公開資源放行
if (uri.endsWith("login.jsp") || uri.contains("/static/")) {
chain.doFilter(req, res);
return;
}
// 未登入
if (session == null || session.getAttribute("userRole") == null) {
response.sendRedirect(request.getContextPath() + "/login.jsp");
return;
}
String role = (String) session.getAttribute("userRole");
// 權限判斷邏輯
if ("admin".equals(role) || hasPermission(role, uri)) {
chain.doFilter(req, res);
} else {
response.sendError(HttpServletResponse.SC_FORBIDDEN, "權限不足");
}
}
// ... init, destroy, hasPermission 方法省略
}
<filter>
<filter-name>AuthFilter</filter-name>
<filter-class>com.example.AuthFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
@WebFilter) 簡化部署描述檔。