权限验证:登录,可实现免登陆,第二次登录可直接进入页面

利用过滤去实现权限验证

思路分析:

1.当用户没有登录时

除了访问登录界面和注册登录界面以及login.do之外,其他的都不能访问,如果访问其他页面将进入登录界面

2.当用户登录时

1)cookie中有用户信息,点击登录就可以直接登录、

2)cookie里面没有用户信息,判断用户是不是第二次登录

3)cookie和session里面都没有用户信息,那么用户需要输入账号密码进行验证

   账号密码正确:登录成功,信息同时保存在会话对象中

   如果勾选了三天免登陆,那么信息保存在cookie中

   账号密码错误:返回登录界面重新登录

实现步骤:


1.创建项目DServlet,布置运行环境

2.在web下面的WEB-INF下新建lib文件夹,导入需要的第三方jar包

3.在src下面创建com.jrt.web.filter.UserRequestFilter

业务逻辑:

继承ServletException类,首先强转成HttpServlet类型参数,然后获取username值,如果用户登录成功,那么session里面是有值的,如果登录过,可以直接进入index界面,如果没有的登录,再一次进行判断,是不是除了(login.jsp,register.jsp,loginServlet.do)之外的,都会跳转到login.jsp界面进行登录,实现过滤。

4.在src下面创建com.jrt.web.servlet.LoginServlet

业务逻辑:

首先确认cookie里面有没有用户,有用户可以不用输入直接登录了,获取所有的cookis循环判断,然后判断是不是第二次登录,两种情况都不是的情况下输入用户名密码进行验证,验证过程中注意用户是否勾选三天免登陆,勾选的话,要在cookie里面保存信息

5.写前端页面index.jsp

6.写前端页面login.jsp

在form表单里面设置使用户输入用户名和密码,设置三天免登陆选项。

7.写前端页面,register.jsp用户未登录也可以进入这个页面。

UserRequestFilter.java


package com.jrt.web.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

@WebFilter(urlPatterns = {"*.do","*.jsp"})
public class UserRequestFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //1.强转
        HttpServletRequest request=(HttpServletRequest)servletRequest;
        HttpServletResponse response=(HttpServletResponse)servletResponse;
        //2.如果用户已经登录成功,那么session里面是有值的,通过判断username来判断是否登录
        String username=(String)request.getSession().getAttribute("username");
        System.out.println("username="+username);
        System.out.println(">>>"+request.getRequestURI());
        //3.如果已经登录过
        if(username!=null){
            request.getRequestDispatcher("index.jsp").forward(request,response);
            return;
        }
        //4.如果没有登录。只有两种情况放行  去登录界面或者注册界面
        if(username==null && !isCheck(request.getRequestURI())){
            System.out.println("in.....");
            request.getRequestDispatcher("login.jsp").forward(request,response);
            return;
        }

        //放行
       filterChain.doFilter(request,response);
    }
    public boolean isCheck(String requsetURI){
        boolean flag=false;
        Set<String> sets=new HashSet<>();
        sets.add("register.jsp");
        sets.add("login.jsp");
        sets.add("loginServlet.do");
        for(String uri:sets){
            if(requsetURI.endsWith(uri)){
                flag=true;
                break;
            }
        }
        return flag;
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

 loginServlet.java

package com.jrt.web.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet("/loginServlet.do")
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.首先确认cookie里面有没有用户,就可以不用登录了
        //获取所有的cookis
        Cookie[] cs=req.getCookies();
        //一定要判断这个里面是不是空的
        if(cs!=null){
            System.out.println("进行cookie判断");
            for(Cookie cookie:cs){
                String name=cookie.getName();
                String value=cookie.getValue();
               //value= URLDecoder.decode(value,"utf-8");
                if("username".equals(name)){
                    System.out.println("cookies里面的name:"+name);
                    req.getSession().setAttribute("username",value);
                    req.getRequestDispatcher("index.jsp").forward(req,resp);
                    return;
                }
            }
        }

        //2.判断是不是第二次登录这里可以不进行,因为过滤器在username值不为空时,已经进行了放行
        String uname=(String) req.getSession().getAttribute("username");
        if(uname!=null){
            req.getRequestDispatcher("index.jsp").forward(req,resp);
            return;
        }
        //cookie里面没有,也不是第二次登录,只能输入账号密码进行判断
        req.setCharacterEncoding("utf-8");
        String username =req.getParameter("username");
        System.out.println(username);
        String password =req.getParameter("pwd");
        System.out.println(password);
        if("zhangsan".equals(username)&&"123456".equals(password)){
            //判断他是否选择了三天免登陆
            if("auto".equals(req.getParameter("auto"))){
                Cookie cookie1=new Cookie("username",username);
                Cookie cookie2=new Cookie("password",password);

                cookie1.setMaxAge(24*60*60*3);
                cookie2.setMaxAge(24*60*60*3);

                resp.addCookie(cookie1);
                resp.addCookie(cookie2);

            }
            String success="登录成功";
            req.setAttribute("success",success);
            HttpSession session = req.getSession();
            session.setAttribute("username",username);
            req.getRequestDispatcher("index.jsp").forward(req,resp);
        }else{
            resp.sendRedirect("login.jsp");
        }
    }
}

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h2 align="center">用户登录验证</h2>
<form method="post" action="loginServlet.do" >
    用户名:<input type="text" name="username" id="username"><br>
    密码:<input type="text" name="pwd" id="pwd"><br>
    <input type="submit" value="登录"><br>
    <input type="checkbox" name="auto" value="auto" id="auto">三天免登陆
    <a href="register.jsp">前去注册</a>
</form>
</body>
</html>

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  这里是index
  </body>
</html>

register.jsp 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
这是注册页面
</body>
</html>

上一篇:后台技术学习5


下一篇:Linux 常用命令总结