Cookie概述 - 【Cookie和Session篇】保证超级轻松学会,学不会我会怀疑人生的。。

关于会话

  • 什么是会话?
        会话是浏览器和服务器之间发生的一系列请求和响应的过程。
        会话开始: 打开浏览器-访问京东
        会话结束:关闭浏览器
  • 会话产生的数据
        在客户端与服务器端交互的过程中,也会产生一些数据。为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session
  • 本质就是在浏览器或者服务器存取数据的技术

Cookie概述

    Cookie技术就是在浏览器端存取会话的数据

Cookie特点

  • 数据是key-value键值对的形式 name=jack
  • 数据有存活时间,并且可以修改
  • 不能识别一些特殊符号,所以需要对这个符号进行转码(编码解码)
  • 一个Cookie只能存储一个键值对key-value
  • cokie是浏览器保存会话数据的技术,

Cookie的执行流程

在这里插入图片描述

  • (1)浏览器第一次访问Servlet,创建一个Cookie对象(默认保存一个键值对JSESSIONID)
  • (2)Servlet将生成的Cookie发送到浏览器
  • (3)浏览器自动保存
  • (4)第二次访问服务器Servlet,浏览器自动将Cookie数据获取放在请求中

(1)Cookie的创建
Cookie(String name, String value) 创建cookie对象
String getName()获取cookie的名称
String getValue() 获取cookie的值

创建和获取Cookie

  1. Cookie的创建
        - Cookie(String name, String value) 创建cookie对象
        - String getName()获取cookie的名称
        - String getValue() 获取cookie的值

  2. 将Cookie发送给服务器
        response.addCookie(Cookie cookie);

  3. Cookie的获取
        Cookie[] getCookies() 获取浏览器发送的cookie
        Cookie[] cookies = request.getCookies();(如果没有cookie会返回一个null)

实现案例

通过SetCookieServlet设置Cookie,再通过GetCookieServlet获取Cookie。

@WebServlet("/SetCookieServlet")
public class SetCookieServlet extends HttpServlet {
    
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //一个cookie只能存储一个键值对key-value cokie是浏览器保存会话数据的技术,
        //保存cookie,保存账号密码,第二次的时候,浏览器会自动放到request请求中 将其带数据到服务器里面并显示,自动验证
        //1、创建cookie 一个cookie只有一个键值对
        Cookie cookie1 = new Cookie("username", "Strive_GF");
        Cookie cookie2 = new Cookie("password", "123456");

        //2、将Cookie发送给浏览器 
        response.addCookie(cookie1);
        response.addCookie(cookie2);
    }
}
@WebServlet("/GetCookieServlet ")
public class GetCookieServlet extends HttpServlet {
    
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    

        //获取cookie ,第二次开始访问网站,此时浏览器会自动地将保存的cookie放到请求带到Servlet
        Cookie[] cookies = request.getCookies();//一个cookie都没有 getCookie()方法返回的是null

        if(cookies != null){
    
    
            //循环所有的cookie
            for(Cookie cookie:cookies){
    
    
                System.out.println(cookie.getName()+" : "+cookie.getValue());
            }
        }else{
    
    
            System.out.println("没有查询到cookie");
        }
    }
}

运行结果:

  1. 直接运行GetCookieServlet
    在这里插入图片描述
    2.先运行SetCookieServlet给cookie设值,再通过GetCookieServlet获取cookie值
    在这里插入图片描述
  2. 关闭浏览器之后直接通过url地址GetCookieServlet获取cookie
    在这里插入图片描述

Cookie存活时间

void setMaxAge(int expiry) 设置cookie的最大生存时间(单位:秒)
    (1)默认情况下,浏览器中Cookie的存活时间是一个会话
    (2)我们有时候需要设置Cookie的 存活时间
如果你设置了setMaxAge,Cookie就会按存活时间保存在硬盘中

案例实现

@WebServlet("/SetMaxAgeServlet")
public class SetMaxAgeServlet extends HttpServlet {
    
    

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //创建cookie对象
        Cookie cookie1 = new Cookie("username","Strive_GF");
        Cookie cookie2 = new Cookie("password","1234");

        //设置cookie的存活时间 单位是秒,这里是一天
        cookie1.setMaxAge(24*60*60);
        cookie2.setMaxAge(24*60*60);
        //将cookie发送给服务器  因为cookie是浏览器保存会话数据的技术 ,所以必须将cookie发给浏览器
        response.addCookie(cookie1);
        response.addCookie(cookie2);
    }
}

运行结果:

  1. 运行SetMaxAgeServlet设置cookie,并通过上文的GetCookieServlet来获取Cookie
    在这里插入图片描述
  2. 再次关闭浏览器,通过GetCookieServlet
    在这里插入图片描述

Cookie的访问路径

  • void setPath(String uri)
        设置cookie的路径 —— 浏览器会根据这个路径判断哪些cookie要发送给服务器,不是这个服务器下的cookie就不会发送给该服务器(比如:淘宝、京东你都设置了自动登录,账号相同但是密码不同,这时候就需要设置这个访问路径,来让对应的cookie发送给对应的服务器)
  1. 方式1:/webName/ 当访问webName项目下的所有资源,请求都会携带Cookie**【默认方式】**
  2. 方式2:/webName/user 当访问webName项目下的user模块下的所有资源,请求都会携带Cookie
  3. 方式3:/ 当访问服务器中所有资源,请求都会携带Cookie

案例实现

@WebServlet("/SetPathServlet")
public class SetPathServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //创建cookie对象
        Cookie cookie1 = new Cookie("username","Strive_GF_SetPathServlet");
        Cookie cookie2 = new Cookie("password","123456");

        //设置cookie的存活时间 单位是秒,这里是一天
        cookie1.setMaxAge(24*60*60);
        cookie2.setMaxAge(24*60*60);

        //request.getContextPath() 获取当前项目名称 设置
        cookie1.setPath(request.getContextPath());
        cookie2.setPath(request.getContextPath());
        //将cookie发送给服务器  因为cookie是浏览器保存会话数据的技术 ,所以必须将cookie发给浏览器
        response.addCookie(cookie1);
        response.addCookie(cookie2);
    }
}
@WebServlet("/SetPath_TaoBao_Servlet")
public class SetPath_TaoBao_Servletextends HttpServlet {
    
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //创建cookie对象
        Cookie cookie1 = new Cookie("username","SetPath_TaoBao_Servlet");
        Cookie cookie2 = new Cookie("password","123456");

        //设置cookie的存活时间 单位是秒,这里是一天
        cookie1.setMaxAge(24*60*60);
        cookie2.setMaxAge(24*60*60);

		//将cookie访问路径设置为/taobao
        cookie1.setPath("/taobao");
        cookie2.setPath("/taobao");
        //request.getContextPath() 获取当前项目名称 设置
//        cookie1.setPath(request.getContextPath());
//        cookie2.setPath(request.getContextPath());

        //将cookie发送给服务器  因为cookie是浏览器保存会话数据的技术 ,所以必须将cookie发给浏览器
        response.addCookie(cookie1);
        response.addCookie(cookie2);
    }
}

运行结果:

  1. 通过SetPathServlet设置项目的访问路径为当项目路径,再通过GetCookieServlet获取
    在这里插入图片描述
  2. 先运行SetPath_TaoBao_Servlet将cookie.setPath(“/taobao”)再运行GetCookieServlet获取cookie
    在这里插入图片描述

Cookie的清除

并没有清除Cookie的方法,但是可以通过以下两种方式来达到清除cookie的目的:

  1. 可以修改存活时间为0
        将cookie的生存时间设置为0(cookie.setMaxAge(0))
  2. 可以使用空值覆盖原值的方法来达到清除cookie的目的,后一个用来覆盖cookie必须名称与路径与原来的cookie一致
        再创建一次cookie,key与原来的一样,值设置为""空值,达到清除效果

案例实现

//1、修改存活时间为0

@WebServlet("/ClearCookieServlet_1")
public class ClearCookieServlet_1 extends HttpServlet {
    
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //创建cookie对象
        Cookie cookie1 = new Cookie("username","ClearCookieServlet_1");
        Cookie cookie2 = new Cookie("password","123456");
        //设置cookie的存活时间为0  也就是创建即销毁
        cookie1.setMaxAge(0);
        cookie2.setMaxAge(0);
        
        //将cookie发送给服务器
        response.addCookie(cookie1);
        response.addCookie(cookie2);
    }
}
//2、使用空值覆盖原值的方法来达到清除cookie的目的

@WebServlet("/ClearCookieServlet_2")
public class ClearCookieServlet_2 extends HttpServlet {
    
    

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //通过值覆盖 设置cookie中对应的key的值为""空来达到清除cookie的目的
        Cookie cookie1 = new Cookie("username","");
        Cookie cookie2 = new Cookie("password","");

        cookie1.setMaxAge(24*60*60);
        cookie2.setMaxAge(24*60*60);
        //发送给服务器
        response.addCookie(cookie1);
        response.addCookie(cookie2);
    }
}

运行结果

  1. 通过ClearCookieServlet_1将cookie存活时间修改为0,再通过GetCookieServlet获取cookie
    在这里插入图片描述
  2. 通过ClearCookieServlet_2将cookie的值覆盖为空值"",再调用GetCookieServlet获取cookie
    在这里插入图片描述
    注意:建议使用第一种方式来清除cookie,第二种方式,只是空值覆盖

Cookie的编码问题

原因:

  1. Cookie不能识别一些特殊符号,所以需要对这个符号进行转码(编码和解码),防止出现一些不认识的乱码先写
        - 编码: URLEncoder.encode(date, “UTF-8”)
        - 解码: URLDecoder.decode(date, “UTF-8”)
  2. 有的值cookie不能保存,则先编码再保存

案例实现

  1. 我们先看没有进行转码的现象
@WebServlet("/EncodeServlet")
public class EncodeServlet extends HttpServlet {
    
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    

        //创建cookie对象
        Cookie cookie1 = new Cookie("username", URLEncoder.encode("我叫浪夏一学 2020年9月12日17:43:02"));
        Cookie cookie2 = new Cookie("password", URLEncoder.encode("中国1234"));
        //设置cookie对象存活期
        cookie1.setMaxAge(24*60*60);
        cookie2.setMaxAge(24*60*60);
        //发送给服务器
        response.addCookie(cookie1);
        response.addCookie(cookie2);
    }
}

通过EncodeServlet设置cookie,再通过GetCookieServlet获取
在这里插入图片描述
2.通过encode和decode编码解码来实现

@WebServlet("/EncodeServlet")
public class EncodeServlet extends HttpServlet {
    
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    

        //创建cookie对象
//        Cookie cookie1 = new Cookie("username", URLEncoder.encode("我叫浪夏一学 2020年9月12日17:43:02"));
//        Cookie cookie2 = new Cookie("password", URLEncoder.encode("中国1234"));
        //通过URLEncoder.encode()编码
        Cookie cookie1 = new Cookie("username", URLEncoder.encode("我叫浪夏一学 2020年9月12日17:43:02","utf-8"));
        Cookie cookie2 = new Cookie("password", URLEncoder.encode("中国1234","utf-8"));
        //设置cookie对象存活期
        cookie1.setMaxAge(24*60*60);
        cookie2.setMaxAge(24*60*60);
        //发送给服务器
        response.addCookie(cookie1);
        response.addCookie(cookie2);
    }
}
@WebServlet("/DecodeServlet")
public class DecodeServlet extends HttpServlet {
    
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    

        //获取cookie数组
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
    
    
            //循环所有的cookie
            for(Cookie cookie:cookies){
    
    
                //URLDecoder.decode()对其解码
                System.out.println(cookie.getName()+" "+ URLDecoder.decode(cookie.getValue(),"utf-8"));
            }
        }else{
    
    
            System.out.println("没有查询到cookie");
        }
    }
}

运行结果:
先通过EncodeServlet对其编码,在通过DecodeServlet解码输出
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40542534/article/details/108550057
今日推荐