登錄驗證案例(Filter過濾器)

登錄驗證案例

* 需求
    1. 訪問UserCRUD_case案例的資源,驗證其是否登錄
    2. 若登錄了,則直接放行
    3. 若未登錄,則跳轉到登陸界面,提示您尚未登錄,請先登錄

* 分析
    * 如何判斷用戶是否登錄呢?
        * 在UserCRUD_case案例中,我們在編寫用戶登錄LoginServlet時,登陸成功後進行了以下操作:
        // 5.登陸判斷
        UserService service = new UserServiceImpl();
        User loginUser = service.login(user);
        if (loginUser != null){
            //登陸成功
            System.out.println("登陸成功");
            session.setAttribute("user", loginUser);
            //跳轉到index.jsp
            response.sendRedirect(request.getContextPath()+"/index.jsp");
        }else{
  • 據此我們可以知道,若登陸成功,則在session中會存在一個名爲user的數據,所以我們可以通過查看session中是否存在user即可知道是否登錄;所以此登陸驗證便可以這樣實現:
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        // 0.強制轉換
        HttpServletRequest request = (HttpServletRequest) req;
        // 1.獲取請求路徑
        String uri = request.getRequestURI();
        // 2.判斷是否是登錄資源
        if (uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/checkCodeServlet") || uri.contains("/css/") || uri.contains("/js/") || uri.contains("/fonts")){
            //包含,即是要登陸,放行
            chain.doFilter(req, resp);
        }else{
            // 不包含,要判斷是否已登陸
            Object user = request.getSession().getAttribute("user");
            if (user != null){
                // 不爲空,已登錄,放行
                chain.doFilter(req, resp);
            }else{
                //沒有登陸,轉發到登陸界面,提示錯誤信息
                request.setAttribute("login_error", "您尚未登錄,請先登錄!");
                request.getRequestDispatcher("/login.jsp").forward(request, resp);
            }
        }
    }
  • 注意
    我們在過濾資源時,並非要過濾登錄相關的資源,而登錄相關資源除了login.jsp;LoginServlet;驗證碼,還有css,js樣式;這些資源也一定不要攔截
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章