zoukankan      html  css  js  c++  java
  • Cookie(临时存储和定时存储、有效路径、Cookie的获取、删除、Cookie实现三天免登录)

    一、Cookie的临时存储和定时存储

    Cookie解决了不同请求的数据共享问题。是由服务器保存在客户端的小文本文件,包含了用户的信息,可以避免用户重复输入用户名和密码进行登录。浏览器请求Cookie,服务器响应时返回Cookie,浏览器存储返回的Cookie。

    1、临时存储:

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("UTF-8");//设置服务器的编码,默认是ISO-8859-1
            response.setContentType("text/html; charset = utf-8");//告诉浏览器服务器的编码格式
            Cookie cookie=new Cookie("passwsord","123456");
            response.addCookie(cookie);
        }

    请求:

    响应:

    当访问本工程的一个不存在Cookie的Servlet时:、

    可以看出请求中依旧存在Cookie,但是响应中已经没有Cookie的相关信息了:

    当关闭了浏览器再次打开访问工程下的一个不存在的Servlet时:

    响应和请求中均无Cookie的相关信息:

    这是因为在第一次访问带有Cookie的Servlet时,Cookie被创建,但是因为Cookie存储在了浏览器的运行内存中,浏览器关闭后创建的Cookie随之消失。

     2、定时存储:

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("UTF-8");//设置服务器的编码,默认是ISO-8859-1
            response.setContentType("text/html; charset = utf-8");//告诉浏览器服务器的编码格式
            Cookie cookie=new Cookie("passwsord","123456");
            cookie.setMaxAge(7*24*3600);//七天
            response.addCookie(cookie);
        }

    第一次访问带有Cookie的Servlet:

     

    请求和响应中均有Cookie。

    访问同一工程下的不具有Cookie的Servlet:

     

    请求中有Cookie,响应中没有Cookie。

    关闭浏览器重新访问不带Cookie的Servlet:

    请求中带有Cookie,响应中没有。这是因为此时Cookie被设定了有效期,在有效期内可以在电脑硬盘中找到,即使关闭浏览器,在有效期内Cookie依旧存在。

    3、注意事项

    (1)Cookie不能存储中文。

    (2)一个Cookie对象只能存储一个键值对。

    二、Cookie的有效路径

    1、程序实现:

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("UTF-8");//设置服务器的编码,默认是ISO-8859-1
            response.setContentType("text/html; charset = utf-8");//告诉浏览器服务器的编码格式
            Cookie cookie=new Cookie("passwsord","123456");
            cookie.setPath("/CookieDemo_war_exploded/abc");
            cookie.setMaxAge(7*24*3600);//有效期七天
            response.addCookie(cookie);
        }

    效果:

    当访问http://localhost:8080/CookieDemo_war_exploded/abc下的Servlet时,请求和响应中均有Cookie。

     

     当改变路径访问虚拟路径不是abc的Servlet时,请求和响应中都没有Cookie的信息。(如果不对路径进行限制,请求中应该有Cookie信息)

     

    三、Cookie的获取

    1、先创建Cookie对象,设置Cookie的键和值:

            Cookie cookie1=new Cookie("password1","123456");
            Cookie cookie2=new Cookie("password2","123458");
            Cookie cookie3=new Cookie("password3","123454");
            Cookie cookie4=new Cookie("password4","123452");
            cookie1.setMaxAge(1*24*3600);
            cookie2.setMaxAge(1*24*3600);
            cookie3.setMaxAge(1*24*3600);
            cookie4.setMaxAge(1*24*3600);
            response.addCookie(cookie1);
            response.addCookie(cookie2);
            response.addCookie(cookie3);
            response.addCookie(cookie4);

    2、对Cookie进行遍历:

            Cookie [] cookies=request.getCookies();//获取Cookie数组
            if(cookies!=null){
                for (Cookie c:cookies){
                    String name=c.getName();
                    String value=c.getValue();
                    System.out.println(name+" "+value);
                }
            }

     四、Cookie的删除

    1、设置一个Cookie,与要删除的Cookie同名,并将有效时间设置为0:

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            Cookie cookie1=new Cookie("password1","123456");
            cookie1.setMaxAge(0);
            response.addCookie(cookie1);
        }

    可以看出响应中该Cookie的存活时间为0。

    2、检验Cookie是否已经被删除:

    运行程序对Cookie进行遍历:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            Cookie [] cookies=request.getCookies();
            if(cookies!=null){
                for (Cookie c:cookies){
                    String name=c.getName();
                    String value=c.getValue();
                    System.out.println(name+" "+value);
                }
            }
        }

     

     

    无论是控制台还是抓包结果,都证明Cookie已经被覆盖(删除)。

    五、Cookie的应用——三天免登录

    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>");
        }

    登录界面采用纯粹的servlet开发,当然,学习过jsp后就可以用jsp代替了。

     (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中的数据。

  • 相关阅读:
    《C和指针》读书笔记——第一章 快速上手
    《C和指针》读书笔记——第三章 数据
    Linux下简易蜂鸣器驱动代码及测试实例
    Linux下GPIO驱动(五) misc_register();
    Linux下实现流水灯等功能的LED驱动代码及测试实例
    Linux下GPIO驱动(四) gpio_request();gpio_free();
    支持阻塞操作和轮询操作的globalfifo设备驱动代码分析以及测试代码
    基于等待队列及poll机制的按键驱动代码分析和测试代码
    Linux下GPIO驱动(一) 一个简单的LED驱动
    虚拟内存设备驱动memdev及实例代码
  • 原文地址:https://www.cnblogs.com/zhai1997/p/11530721.html
Copyright © 2011-2022 走看看