Cookie对象的简介

Cookie是浏览器提供的一种技术,通过服务器的程序能将一些只须保存在客户端,或者在客户端进行处理的数据,放在本地的计算机上,不需要通过网络传输,因而提高网页处理的效率,并且能够减少服务器的负载,但是由于Cookie 是服务器端保存在客户端的信息, 所以其安全性也是很差的。例如常见的记住密码则可以通过 Cookie 来实现。
有一个专门操作Cookie的类 javax.servlet.http.Cookie。随着服务器端的响应发送给客户端,保存在浏览器。当下次再访问服务器时把Cookie再带回服务器。
Cookie 的格式:键值对用“=”链接,多个键值对间通过“;”隔开。

Cookie对象的发送和获取

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

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

创建Cookie对象:
Cookie cookie = new Cookie(“uname”,”zhangsan”);

发送Cookie对象:
response.addCookie(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());
}
}

实例如下:
image.png —-
运行结果:
image.png
image.png

Cookie对象的存活周期

除了 Cookie 的名称和内容外,我们还需要关心一个信息,到期时间,到期时间用来指定该 cookie 何时失效。默认
为当前浏览器关闭即失效。我们可以手动设定 cookie 的有效时间(通过到期时间计算),通过 setMaxAge(int
time);方法设定 cookie 的最大有效时间,以秒为单位。

到期时间的取值:
(1)负整数
若为负数,表示不存储该 cookie。
cookie 的 maxAge 属性的默认值就是-1,表示只在浏览器内存中存活,一旦关闭浏览器窗口,那么 cookie 就
会消失。
(2)正整数
若大于 0 的整数,表示存储的秒数。
表示 cookie 对象可存活指定的秒数。当生命大于 0 时,浏览器会把 Cookie 保存到硬盘上,就算关闭浏览器,
就算重启客户端电脑,cookie 也会存活相应的时间。
(3)零
若为 0,表示删除该 cookie。

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

如:
设置Cookie对象指定时间后失效
Cookie cookie = new Cookie(“uname”,”zhangsan”);// 创建Cookie对象
cookie.setMaxAge(3 24 60 * 60);// 设置Cookie 3天后失效
response.addCookie(cookie);// 发送Cookie对象

Cookie对象的注意点

(1)Cookie保存在当前浏览器中;
在一般的站点中常常有记住用户名这样一个操作,该操作只是将信息保存在本机上,换电脑以后这些信息就无
效了,而且 cookie 还不能跨浏览器。
(2)Cookie不支持中文;
Cookie 中不能出现中文,如果有中文则通过 URLEncoder.encode()来进行编码,获取时通过
URLDecoder.decode()来进行解码。
(3)同名Cookie问题;
如果服务器端发送重复的Cookie那么会覆盖原有的Cookie。
(4) 浏览器存放Cookie的数量;
不同的浏览器对Cookie也有限定,Cookie的存储有是上限的。Cookie是存储在客户端(浏览器)的,而且一般
是由服务器端创建和设定。后期结合Session来实现回话跟踪。

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

如果设置path,并且当前访问的路径包含了cookie的路径(当前访问路径在cookie路径基础上要比cookie的范
围小)cookie就会加载到request对象之中。
cookie的路径指的是可以访问该cookie的顶层目录,该路径的子路径也可以访问该cookie。
总结:当访问的路径包含了cookie的路径时,则该请求将带上该cookie;如果访问路径不包含cookie路径,则该请
求不会携带该cookie。