1.Cookie特点
Cookie:会话数据保存在浏览器客户端,只能保存非中文字符串类型的数据。
2.Cookie技术核心
Cookie类:用于存储会话数据
1)构造Cookie对象
Cookie(java.lang.String name, java.lang.String value)
2)设置cookie
void setPath(java.lang.String uri) :设置cookie的有效访问路径(通常是项目名,指定访问哪个项目的时候附带此cookie)
void setMaxAge(int expiry) : 设置cookie的有效时间
void setValue(java.lang.String newValue) :设置cookie的值
3)发送cookie到浏览器端保存
void response.addCookie(Cookie cookie) : 发送cookie
4)服务器接收cookie
Cookie[] request.getCookies() : 接收cookie
[注]:
服务器第一次访问站点的时候request不会携带cookie(硬盘上不存在),第一次访问过程中response添加之后才有;所以在代码过程中需要判空
3.Cookie原理
1)服务器创建cookie对象,把会话数据存储到cookie对象中。
new Cookie("name","value");
2) 服务器发送cookie信息到浏览器
response.addCookie(cookie);
在响应头中表现为:set-cookie: name=eric 这个cookie的键值对就是name=eric
3)浏览器得到服务器发送的cookie,然后保存在浏览器端。
4)浏览器在下次访问服务器时,会带着cookie信息
在后面的请求头中表现为: cookie: name=eric (隐藏带着一个叫cookie名称的请求头)
5)服务器接收到浏览器带来的cookie信息
request.getCookies();
4.细节部分:
1)void setPath(java.lang.String uri) :设置cookie的有效访问路径。有效路径指的是cookie的有效路径保存在哪里,那么浏览器在有效路径下访问服务器时就会带着cookie信息,否则不带cookie信息。一般这个有效路径是设置到某个项目的根目录
示例代码:
/**
* 1)设置cookie的有效路径。默认情况:有效路径在当前web应用下。 /project0
*/
cookie1.setPath("/project1");
cookie2.setPath("/project2");
2)void setMaxAge(int expiry) : 设置cookie的有效时间。
正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。
负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!!
零:表示删除同名的cookie数据
示例代码:
cookie1.setMaxAge(20); //20秒,从最后不调用cookie1开始计算,这里是以秒为单位
cookie1.setMaxAge(-1); //cookie1保存在浏览器内存(会话cookie)
cookie1.setMaxAge(0); //删除cookie
3)Cookie数据类型只能保存非中文字符串类型的。可以保存多个cookie,但是浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。(也是cookie最大的局限性,不能保存对象)
4)cookie只在本浏览器有效,而且重名的cookie会被覆盖
5.Session
Session特点:会话数据保存在服务器端(内存中),可以保存多种数据类型和自定义对象.
6.Session技术核心
HttpSession类:用于保存会话数据
1)创建或得到session对象
HttpSession getSession()
HttpSession getSession(boolean create)
[注]:boolean create的含义是:如果session不存在,是否创建一个新的session
没有参数和boolean create=true的getSession()方法都表示创建,只有boolean create=false表示不创建
2)设置session对象
void setMaxInactiveInterval(int interval) : 设置session的有效时间,单位是秒,相当于cookie中的setMaxage
void invalidate() : 销毁session对象
java.lang.String getId() : 得到session编号
3)保存会话数据到session对象
void setAttribute(java.lang.String name, java.lang.Object value) : 保存数据
java.lang.Object getAttribute(java.lang.String name) : 获取数据
void removeAttribute(java.lang.String name) : 清除数据,与销毁session对象是不同的概念
7.Session原理
前提: 在哪个session域对象保存数据,就必须从哪个域对象取出
浏览器1:(给session1分配一个唯一的JSESSIONID:s001,把s001发送给浏览器)
1)创建session对象,保存会话数据
HttpSession session = request.getSession(); --保存会话数据 session1
浏览器1 的新标签页面(带着s001的标记到服务器查询,s001->session1,返回session1)
1)得到session对象的会话数据
HttpSession session = request.getSession(); --可以取出 session1
新的浏览器1:
1)得到session对象的会话数据
HttpSession session = request.getSession(); --不一定可以取出,不同的浏览器可能不同,可能是session2也可能是session1
浏览器2:(没有带s001,不能返回session1)
1)得到session对象的会话数据
HttpSession session = request.getSession(); --不可以取出 s3
代码解读:HttpSession session = request.getSession();
1)第一次访问创建session对象,给session对象分配一个唯一的ID,叫JSESSIONID
new HttpSession();
2)把JSESSIONID作为Cookie的值发送给浏览器保存
Cookie cookie = new Cookie("JSESSIONID", sessionID);
response.addCookie(cookie);
3)第二次访问的时候,浏览器带着JSESSIONID的cookie访问服务器
4)服务器得到JSESSIONID,在服务器的内存中搜索是否存放对应编号的session对象。
if(找到){
return map.get(sessionID);
}
Map<String,HttpSession>]
<"s001", s1>
<"s001,"s2>
5)如果找到对应编号的session对象,直接返回该对象
6)如果找不到对应编号的session对象,创建新的session对象,继续走1的流程
结论:通过JSESSION的cookie值在服务器找session对象session的基础是cookie,也是对cookie技术的扩展可提升
总结:cookie的使用范围都是同一次会话,也就是同一个浏览器进程(也可能是统一浏览器不同的窗口)