目 录CONTENT

文章目录

Cookie

在等晚風吹
2023-12-05 / 0 评论 / 0 点赞 / 9 阅读 / 0 字 / 正在检测是否收录...

Cookie

Cookie的引入

Cookie和Session技术的目的:为了解决http协议是无状态的。http协议无状态的意思是,浏览器发起请求(请求中一般是需要携带数据的),服务器接收到请求后调用相关的后端代码去处理该请求,处理完后会响应浏览器。 本次请求与响应结束后,相关的请求与响应数据就会销毁。

如果浏览器又发送了请求,而且本次请求需要用到上次请求传递过的数据,那么本次请求又要重新带上上次请求传递的数据。这样效率不高,而且用户体验度也差!

Cookie对象

Cookie的引入

问题:

​ 为了解决http协议是无状态的。

​ http协议无状态的意思是,浏览器发起请求(请求中一般是需要携带数据的),服务器接收到请求后调用相关的后端代码去处理该请求,处理完后会响应浏览器。 本次请求与响应结束后,相关的请求与响应数据就会销毁。

​ 如果浏览器又发送了请求,而且本次请求需要用到上次请求传递过的数据,那么本次请求又要重新带上上次请求传递的数据。这样效率不高,而且用户体验度也差!

​ 比如:用户在访问京东的时候,在登录界面输入用户名密码登录了。然后用户在结算的时候,因为http协议的无状态性,导致用户又得重新传递一次登录的信息才行!

解决:

​ 浏览器在发起请求的时候,请求达到服务器,服务器认为本次请求携带的数据比较常用,以后的请求也会用得上,那么服务器就会在响应的时候告诉浏览器,把本次请求的数据给保存起来。然后浏览器以后每次发送请求访问服务器的时候都给带上!

总结:

  1. 服务器决定哪些数据是以后的请求也会用到的
  2. 服务器以响应的方式告诉浏览器将常用的这些数据存储起来,存储在浏览器端
  3. 浏览器以后每次发送请求的时候需要带上这些存储起来的数据

特点:

  1. Cookie是浏览器端的数据存储技术
  2. 浏览器每次发起请求的时候,请求信息中就包含了Cookie中存储的数据
  3. Cookie不适合大量数据的存储(每个Cookie存储的数据不超过4KB)
  4. 不安全,不适合存储重要的数据到浏览器端

实现:

​ Cookie技术。(Cookie的作用就是让浏览器保存数据的)

​ 有一个专门操作Cookie的类 javax.servlet.http.Cookie,在服务器端创建,随着服务器端的响应发送给客户端,保存在浏览器。当下次再访问服务器时把Cookie再带回服务器。

Cookie的创建和发送

​ 通过 new Cookie("key","value");来创建一个 Cookie 对象,要想将 Cookie 随响应发送到客户端,需要先添加到 response 对象中,response.addCookie(cookie);此时该 cookie 对象则随着响应发送至了客户端。在浏览器上可以看见。

​ 案例:在Servlet中创建Cookie对象:

// 创建Cookie对象
Cookie cookie = new Cookie("uname","lili");
// 发送(响应)Cookie对象
response.addCookie(cookie);

​ 查看Cookie源码发现:(以下为Cookie源码中截取的重点部分)

public class Cookie implements Cloneable, Serializable {
	private final String name;// name被final修饰,一旦复制就不能改变
    private String value;
	// 没有空构造器,只有一个有参构造器:
	public Cookie(String name, String value) {
        validation.validate(name);// 对name进行校验,确保name是唯一的标识
        this.name = name;// 给name赋值
        this.value = value;// 给value赋值
    }
}

​ 访问创建Cookie对象的Servlet,F12 查看,发现浏览器中Cookie 的格式:键值对形式,用“=”连接

Cookie的获取

​ 在服务器端只提供了一个 getCookies()的方法用来获取客户端回传的所有 cookie 组成的一个数组,如果需要获取单个 cookie 则需要通过遍历,getName()获取 Cookie 的名称,getValue()获取 Cookie 的值。

PS:Cookie是浏览器的技术,如果你关闭了服务器,只要在浏览器中没有失效,Cookie就是一直携带的,可以发送请求到服务器获取Cookie信息。

// 获取Cookie数组
Cookie[] cookies = request.getCookies();
// 判断数组是否为空
if (cookies != null && cookies.length > 0) {
    // 遍历Cookie数组
    for (Cookie cookie : cookies){
        System.out.println(cookie.getName());
        System.out.println(cookie.getValue());
    }
}

再次请求发现:数据确实存储在浏览器中,并通过请求发送给服务器,服务器可以获取到Cookie的信息。

Cookie设置到期时间

​ 除了 Cookie 的名称和内容外,我们还需要关心一个信息,到期时间,到期时间用来指定该 cookie 何时失效。默认为当前浏览器关闭即失效。(可以自己测试一下)

​ 我们可以手动设定 cookie 的有效时间(通过到期时间计算),通过 setMaxAge(int time);方法设定 cookie 的最大有效时间,以秒为单位。

到期时间的取值

  • 负整数

    若为负数,表示不存储该 cookie。

    cookie 的 maxAge 属性的默认值就是-1,表示只在浏览器内存中存活,一旦关闭浏览器窗口,那么 cookie 就会消失。

  • 正整数

    若大于 0 的整数,表示存储的秒数。

    表示 cookie 对象可存活指定的秒数。当生命大于 0 时,浏览器会把 Cookie 保存到硬盘上(PS:不同浏览器磁盘位置不同),就算关闭浏览器(PS:换浏览器不行,不能从谷歌换到火狐),就算重启客户端电脑,cookie 也会存活相应的时间。

  • 若为 0,表示删除该 cookie。

    cookie 生命等于 0 是一个特殊的值,它表示 cookie 被作废!也就是说,如果原来浏览器已经保存了这个 Cookie,那么可以通过 Cookie 的 setMaxAge(0)来删除这个 Cookie。 无论是在浏览器内存中,还是在客户端硬盘上都会删除这个 Cookie。

设置Cookie对象指定时间后失效

// 创建Cookie对象
Cookie cookie = new Cookie("uname","zhangsan");
// 设置Cookie 3天后失效  eg:之前做的登录账号密码 十天内免密登录 就是这样实现的
cookie.setMaxAge(3 * 24 * 60 * 60);
// 发送Cookie对象
response.addCookie(cookie);

可以在f12---->如下位置看到Cookie:

Cookie的注意点

  1. Cookie保存在当前浏览器中。

    不同的浏览器的cookie保存在磁盘上的位置是不同的,不能跨浏览器使用cookie。

    eg:在一般的站点中常常有记住用户名这样一个操作,该操作只是将信息保存在本机上,换电脑以后这些信息就无效了,跨浏览器也无效。

  2. 浏览器存放Cookie的数量

    不同的浏览器对Cookie也有限定,Cookie的存储有是上限的,,我们也不会去存储成千上万个Cookie,Cookie不适合大量数据的存储,每个Cookie存储的数据不超过4KB。Cookie是存储在客户端(浏览器)的,而且一般是由服务器端创建和设定。后期结合Session来实现回话跟踪。

  3. 同名Cookie问题

    如果服务器端发送重复的Cookie那么会覆盖原有的Cookie。

  4. Cookie存中文问题

    Cookie 中不建议出现中文,如果有中文则通过 URLEncoder.encode()来进行编码,获取时通过 URLDecoder.decode()来进行解码。

    eg:一个Servlet中创建键为中文的Cookie并响应给浏览器:

String name = "姓名";
String value = "丽丽";
// 创建Cookie对象
Cookie cookie = new Cookie(name,value);
// 发送Cookie对象
response.addCookie(cookie);

​ 报错:Cookie是不支持中文的

​ 改变:

String name = "姓名";
String value = "丽丽";
// 通过 URL Encoder.encode()来进行编码
name = URLEncoder.encode(name);
value = URLEncoder.encode(value);
// 创建Cookie对象
Cookie cookie = new Cookie(name,value);
// 发送Cookie对象
response.addCookie(cookie);

​ eg:另一个Servlet中取出Cookie:

// 获取Cookie数组
Cookie[] cookies = request.getCookies();
// 判断数组是否为空
if (cookies != null && cookies.length > 0) {
    // 遍历Cookie数组
    for (Cookie cookie : cookies){
        // 获取时通过 URLDecoder.decode()来进行解码
        URLDecoder.decode(cookie.getName());
        URLDecoder.decode(cookie.getValue());
    }
}

Cookie的路径

​ Cookie的setPath设置cookie的路径,这个路径直接决定服务器的请求是否会从浏览器中加载某些cookie。

**情景一:**当前服务器下任何项目的任意资源都可获取Cookie对象

/* 当前项目路径为:s01 */
Cookie cookie = new Cookie("xxx","XXX");
// 设置路径为"/",表示在当前服务器下任何项目都可访问到Cookie对象
cookie.setPath("/");
response.addCookie(cookie);

**情景二:**当前项目下的资源可获取Cookie对象 (默认不设置Cookie的path)

/* 当前项目路径为:s01 */
Cookie cookie = new Cookie("xxx","XXX");
// 设置路径为"/s01",表示在当前项目下任何项目都可访问到Cookie对象
cookie.setPath("/s01"); // 默认情况,可不设置path的值
response.addCookie(cookie);

**情景三:**指定项目下的资源可获取Cookie对象

/* 当前项目路径为:s01 */
Cookie cookie = new Cookie("xxx","XXX");
// 设置路径为"/s02",表示在s02项目下才可访问到Cookie对象
cookie.setPath("/s02"); // 只能在s02项目下获取Cookie,就算cookie是s01产生的,s01也不能获取它
response.addCookie(cookie);

**情景四:**指定目录下的资源可获取Cookie对象

/* 当前项目路径为:s01 */
Cookie cookie = new Cookie("xxx","XXX");
// 设置路径为"/s01/cook",表示在s02/cook目录下才可访问到Cookie对象
cookie.setPath("/s01/cook"); 
response.addCookie(cookie);
0

评论区