首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JSP Filter 實作:依登入狀態與角色控管存取權限

     編輯:程式設計綜合問答

需求情境

開發 Java Web 專案,需依使用者角色(管理員、一般員工、未登入)動態控制資源存取。管理員可操作所有功能,員工僅限部分,未登入者則導向登入頁。

核心做法:單一 Filter + web.xml 設定

不需將不同權限頁面分置資料夾,只需:

  1. 建立實作 javax.servlet.Filter 的類別(如 AuthFilter)。
  2. 在 doFilter() 中從 HttpSession 取得使用者角色,根據請求路徑 (HttpServletRequest.getRequestURI()) 決定是放行、導向登入頁或顯示 403。
  3. 在 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 方法省略
}

web.xml 設定

<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) 簡化部署描述檔。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved