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)