登录验证案例(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样式;这些资源也一定不要拦截
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章