Cookie 对象
Cookie 是浏览器提供的一种技术,通过服务器的程序能将一些只须保留在客户端,或者在客户端进行解决的数据,放在本地的计算机上,不须要通过网络传输,因此进步网页解决的效率,并且可能缩小服务器的负载,然而因为 Cookie 是服务器端保留在客户端的信息,所以其安全性也是很差的。例如常见的记住明码则能够通过 Cookie 来实现。
有一个专门操作 Cookie 的类 javax.servlet.http.Cookie。随着服务器端的响应发送给客户端,保留在浏览器。当下次再拜访服务器时把 Cookie 再带回服务器。
Cookie 的格局:键值对用“=”链接,多个键值对间通过“;”隔开。
Cookie 的创立和发送
通过 new Cookie(“key”,”value”); 来创立一个 Cookie 对象,要想将 Cookie 随响应发送到客户端,须要先增加到 response 对象中,response.addCookie(cookie); 此时该 cookie 对象则随着响应发送至了客户端。在浏览器上能够看见。
// 创立 Cookie 对象
Cookie cookie = new Cookie("uname","zhangsan");
// 发送 Cookie 对象
response.addCookie(cookie);
F12 查看
Cookie 的获取
在服务器端只提供了一个 getCookies()的办法用来获取客户端回传的所有 cookie 组成的一个数组,如果须要获取单个 cookie 则须要通过遍历,getName()获取 Cookie 的名称,getValue()获取 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 的无效工夫(通过到期工夫计算),通过 setMaxAge(int time); 办法设定 cookie 的最大无效工夫,以秒为单位。
到期工夫的取值
- 负整数
若为正数,示意不存储该 cookie。
cookie 的 maxAge 属性的默认值就是 -1,示意只在浏览器内存中存活,一旦敞开浏览器窗口,那么 cookie 就会隐没。
- 正整数
若大于 0 的整数,示意存储的秒数。
示意 cookie 对象可存活指定的秒数。当生命大于 0 时,浏览器会把 Cookie 保留到硬盘上,就算敞开浏览器,就算重启客户端电脑,cookie 也会存活相应的工夫。
- 零
若为 0,示意删除该 cookie。
cookie 生命等于 0 是一个非凡的值,它示意 cookie 被作废!也就是说,如果原来浏览器曾经保留了这个 Cookie,那么能够通过 Cookie 的 setMaxAge(0)来删除这个 Cookie。无论是在浏览器内存中,还是在客户端硬盘上都会删除这个 Cookie。
设置 Cookie 对象指定工夫后生效
// 创立 Cookie 对象
Cookie cookie = new Cookie("uname","zhangsan");
// 设置 Cookie 3 天后生效
cookie.setMaxAge(3 * 24 * 60 * 60);
// 发送 Cookie 对象
response.addCookie(cookie);
Cookie 的留神点
- Cookie 保留在以后浏览器中。
在个别的站点中经常有记住用户名这样一个操作,该操作只是将信息保留在本机上,换电脑当前这些信息就有效了。而且 cookie 还不能跨浏览器。
-
Cookie 存中文问题
Cookie 中不能呈现中文,如果有中文则通过 URLEncoder.encode()来进行编码,获取时通过 URLDecoder.decode()来进行解码。
String name = "姓名"; String value = "张三"; // 通过 URLEncoder.encode()来进行编码 name = URLEncoder.encode(name); value = URLEncoder.encode(value); // 创立 Cookie 对象 Cookie cookie = new Cookie(name,value); // 发送 Cookie 对象 response.addCookie(cookie);
// 获取时通过 URLDecoder.decode()来进行解码 URLDecoder.decode(cookie.getName()); URLDecoder.decode(cookie.getValue());
- 同名 Cookie 问题
如果服务器端发送反复的 Cookie 那么会笼罩原有的 Cookie。
- 浏览器寄存 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。
<font color=”red”>总结:当拜访的门路蕴含了 cookie 的门路时,则该申请将带上该 cookie;如果拜访门路不蕴含 cookie 门路,则该申请不会携带该 cookie。</font>
加 VX 理解点我扫码支付
学习更多常识,请退出企鹅群:1080355292,入群暗号(33)