Cookie
总结:
1.Cookie是保存在客户端的,Session是保存在服务端的
2.Cookie的创建和发送
-
创建Cookie
Cookie ck1=new Cookie(“k1”,”v1”);
ck1.setMaxAge(606024*7);
ck1.setPath(“/day38”); -
发送Cookie
response.addCookie(ck1);
3.Cookie分为两个级别
- 会话级别:不设置有效期,默认的,关闭了浏览器Cookie就销毁了.
- 持久级别:设置有效期,关闭浏览器也不会销毁的Cookie.
4.Cookie唯一标识:domain(域名) + path(路径) + name
唯一标识相同的两个cookie,后者覆盖前者
1.运行原理
当客户端和服务端的多次请求响应过程中,需要将部分数据以Cookie的形式保存在客户端
1.当从浏览器向服务端的ServletDemo01发起请求
2.在ServletDemo01中创建2个Cookie对象,分别设置cookie对象的有效期,路径,之后发送cookie.那么本次HTTP协议响应头中会增加如下内容
3.当浏览器识别到Set-Cookie响应头后,会在客户端保存2个Cookie对象,不同的浏览器保存的位置和方式不同,IE保存在cookies文件夹下,火狐浏览器保存在自带的数据库软件中SQLLite中
4.当浏览器向ServletDemo01或者ServletDemo02发起请求时,由于ServletDemo02和
ServletDemo01都拥有共同的路径day16,也就是都在项目day16下,那么本次请求会将刚才保存的cookie对象携带在HTTP的请求部分发送到服务端,在ServletDemo02中可以获取到这2个cookie对象
2.API
创建cookie
Cookie ck1=new Cookie(“k1”,”v1”);
ck1.setMaxAge(606024*7);
ck1.setPath(“/day38”);
发送cookie
response.addCookie(ck1);
获取cookie
Cookie[] cks=request.getCookies();
for(Cookie ck:cks){
ck.getName();
ck.getValue();
}
删除cookie
获取到待删除的cookie
ck.setMaxAge(0);
ck.setPath(“/day38”);
response.addCookie(ck);
API测试
1.测试创建以及发送cookie,将我们自己创建的cookie响应到客户端
在servletDemo01中向客户端发送cookie,有效期设置为1分钟,路径设置为当前项目下
2.客户端接收到响应,在响应头中有我们创建的cookie
3.在浏览器中存储了我们创建的cookie
4.测试获取cookie
在cookie有效期内,访问同一个项目下的servletDemo02
4.测试删除cookies
那么怎么删除保存在客户端的cookie呢?很简单,我们在服务端获取到cookie后,将cookie的有效期设置为0,再重新发送给客户端
在cookie有效期内,访问同一个项目下的servletDemo03
cookie问题:
1.cookie为什么有路径?
客户端的浏览器中保存了不同网站的cookie对象,如果我们没有路径,就会将百度的cookie发送给google,而这样是不允许的.
当我们向某个web项目发起请求时,仅将跟这个项目有关的cookie发送到相关项目下
注意1:当我们不设置cookie路径时,系统会默认将路径设置为当前目录
当我们将cookie的路径设置为"/",就会发现当我们请求请求其他web项目时,也会携带cookie
注意2:当设置的路径具体到某个uri,那么即使同一个项目的其他uri也获取不到
此时即使访问同一个项目下的http://localhost:8082/Cookie_demo/ServletDemo01,也不会携带cookie
2.cookie中不要存放中文
3.cookie过了有效期后,将不再向服务器发送,浏览器自行处理
4.cookie中不会以明文的形式存储重要信息
5.cookie是可以覆盖的,如果重复写入同域名同路径同name的cookie,那么将会覆盖之前的cookie。 详情可看文末
Cookie案例:记录用户上次访问时间
流程分析
代码实现:
cookie其他知识
cookie的分类
1.会话级别的Cookie:默认的.关闭了浏览器Cookie就销毁了.(没设置有效期的即会话级别)
2.持久级别的Cookie:需要设置有效时长的.关闭浏览器也不会销毁的Cookie.
setMaxAge(int expiry); 以秒为单位的时间,超过了该时间后Cookie会自动销毁. setMaxAge(0),手动删除持久性的Cookie。(前提:path和name必须一致)
setPath(String uri); 设置Cookie的有效路径.
例如:
1)cookie.setPath("/day16/demo");
表示day16 项目下,【demo目录】下所有的servlet,都可以访问当前cookie。
但“/day16”或“/day16/aaa”将不能访问。
2)cookie.setPath("/day16");
表示【day16 项目】下的所有servlet都可以访问当前cookie
3)cookie.setPath("/");
表示【tomcat下】的所有的web项目,都可以访问当前cookie
cookie唯一表示:
唯一标示:domain + path + name
domain 域名,不同的网站使用的是不同的域名,cookie就不同。
path 路径,通过cookie.setPath(…)设置的内容。
name cookie名称,通过 new Cookie(name , …) 确定的内容。
例如:以下表示的是两个cookie,可以同时存在。
/web/a/b/cookieName
/web/a/cookieName
如果路径和名称一样,两次addCookie(),后者将覆盖前者。
servletDemo01:
servletDemo02:
此时在浏览器中,会存在同一域名下,不同path的同名cookie