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协议响应头中会增加如下内容
Cookie
3.当浏览器识别到Set-Cookie响应头后,会在客户端保存2个Cookie对象,不同的浏览器保存的位置和方式不同,IE保存在cookies文件夹下,火狐浏览器保存在自带的数据库软件中SQLLite中
Cookie
4.当浏览器向ServletDemo01或者ServletDemo02发起请求时,由于ServletDemo02和
ServletDemo01都拥有共同的路径day16,也就是都在项目day16下,那么本次请求会将刚才保存的cookie对象携带在HTTP的请求部分发送到服务端,在ServletDemo02中可以获取到这2个cookie对象
Cookie
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分钟,路径设置为当前项目下
Cookie
2.客户端接收到响应,在响应头中有我们创建的cookie
Cookie
3.在浏览器中存储了我们创建的cookieCookieCookie
4.测试获取cookie
在cookie有效期内,访问同一个项目下的servletDemo02
Cookie
Cookie
Cookie
4.测试删除cookies
那么怎么删除保存在客户端的cookie呢?很简单,我们在服务端获取到cookie后,将cookie的有效期设置为0,再重新发送给客户端

在cookie有效期内,访问同一个项目下的servletDemo03
Cookie
Cookie

cookie问题:

1.cookie为什么有路径?
客户端的浏览器中保存了不同网站的cookie对象,如果我们没有路径,就会将百度的cookie发送给google,而这样是不允许的.
当我们向某个web项目发起请求时,仅将跟这个项目有关的cookie发送到相关项目下

注意1:当我们不设置cookie路径时,系统会默认将路径设置为当前目录
当我们将cookie的路径设置为"/",就会发现当我们请求请求其他web项目时,也会携带cookie
Cookie
Cookie

注意2:当设置的路径具体到某个uri,那么即使同一个项目的其他uri也获取不到
Cookie
此时即使访问同一个项目下的http://localhost:8082/Cookie_demo/ServletDemo01,也不会携带cookie
2.cookie中不要存放中文
3.cookie过了有效期后,将不再向服务器发送,浏览器自行处理
4.cookie中不会以明文的形式存储重要信息
5.cookie是可以覆盖的,如果重复写入同域名同路径同name的cookie,那么将会覆盖之前的cookie。 详情可看文末

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:
Cookie

servletDemo02:
Cookie

此时在浏览器中,会存在同一域名下,不同path的同名cookie
Cookie