Cookie的应用——Servlet实现三天免登录

时间:2019-09-19
本文章向大家介绍Cookie的应用——Servlet实现三天免登录,主要包括Cookie的应用——Servlet实现三天免登录使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1、工程结构:

 2、Servlet的运用:

(1)登录界面:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html; charset=utf-8");//设置浏览器编码格式
        response.getWriter().write("<html>");
        response.getWriter().write("<head>");
        response.getWriter().write("<title>");
        response.getWriter().write("Login");
        response.getWriter().write("</title>");
        response.getWriter().write("</head>");
        response.getWriter().write("<body bgcolor=\"aqua\">");
        response.getWriter().write("<center>");
        response.getWriter().write("<h3>");
        response.getWriter().write("登录");
        response.getWriter().write("</h3>");
        response.getWriter().write("<form action=\"/Servlet_login_war_exploded/login\" method=\"get\">");
        response.getWriter().write("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用户名:<input type=\"text\" name=\"username\" size=\"12\"><br>");
        response.getWriter().write("密&nbsp;&nbsp;码 :<input type=\"password\" name=\"password\" size=\"6\" ><br><br>");
        response.getWriter().write("<input type=\"submit\" value=\"登录\">");
        response.getWriter().write("<input type=\"reset\" value=\"取消\">");
        response.getWriter().write("</form>");
        response.getWriter().write("</center>");
        response.getWriter().write("</body>");
        response.getWriter().write("</html>");
    }

 (2)LogServlet实现数据库和表单数据的连接,如果在数据库中有对应的用户登录信息则登录成功。如果是第一次登录,还需要建立Cookie,以便下次登陆的时候能够直接读取Cookie中的信息,不用再手动输入自己的信息。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Connection con=null;
        login log= null;
        String account=request.getParameter("username");//获得表单数据
        String password=request.getParameter("password");
        Cookie cookie=new Cookie(account,password);
        cookie.setPath("/Servlet_login_war_exploded/cookie");
        cookie.setMaxAge(3*24*3600);//三天
        response.addCookie(cookie);
        try {
            con=C3p0Utils.getConnection();
            QueryRunner qr = new QueryRunner();
            String sql = "Select * from login where account=? and password=?";
            Object[] select = {account,password};
            log = qr.query(con, sql, new BeanHandler<login>((login.class)), select);
            if(log!=null){

                response.getWriter().write("nihao"+account);
            }
            else{

                response.getWriter().write("wrong");
            }

        }
        catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

 在响应中,存在Cookie信息和Cookie的过期时间。

(3)查询Cookie是否存在,如果存在,再与数据库中的信息进行对比(只有Cookie是不行的,防止用户已经对账户注销,即数据库中已经没有了用户的信息,而使用Cookie进行登录显然是不合理的)

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html; charset=utf-8");//设置浏览器编码格式
        Cookie[] cookies=request.getCookies();
        Connection con=null;
        login log= null;
        int successNum=0;
        try {
            con= C3p0Utils.getConnection();
            QueryRunner qr = new QueryRunner();
            String sql = "Select * from login";
            List<login> list = qr.query(con, sql, new BeanListHandler<login>((login.class)));

            if(cookies!=null) {//验证数据库中是否有与Cookie对应的用户

                for (int i = 0; i < list.size(); i++) {
                    log= list.get(i);
                for (Cookie cookie : cookies) {
                        if((log.getAccount().equals(cookie.getName()))&&(log.getPassword().equals(cookie.getValue()))){
                           successNum++;
                        }
                }
                }
                if(successNum>=1){
                    response.getWriter().write("Successful login with Cookie!");
                }
                else{
                    request.getRequestDispatcher("page").forward(request,response);
                }

            }
            else{
                request.getRequestDispatcher("page").forward(request,response);//请求转发
            }
        }
        catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

(4)过程演示:

第一次访问CookieServlet(因为没有Cookie,或者没有符合要求的Cookie,因此要手动输入实现登录):

 点击登录(在这个过程中,已经生成了Cookie):

 第二次访问CookieServlet(将Cookie中的信息与数据库中的数据进行比对),下图是已经有Cookie的情况:

 显然:第二次访问的时候,没有登录界面,可以直接调用Cookie中的数据。

原文地址:https://www.cnblogs.com/zhai1997/p/11552587.html