Cookie:把会话数据保存到客户端的技术,浏览器自身具备存储Cookie数据的能力,同时具有自动携带数据的能力
Session:把会话数据保存到服务端的技术,使用散列的结构存储数据 依赖cookie
cookie和session:都是用来存储会话数据的
区别:cookie把数据保存在客户端,session是把数据保存在服务端
cookie不便于保存大量数据,因为网络压力大。而session可以保存大量的数据,但是服务器压力大
cookie技术不安全,可能会篡改数据,而session比较安全。
session技术依赖于cookie技术。
Cookie: 存在于:响应头set-Cookie 请求头:Cookie 通过请求request获取 注意cookie不支持中文
0 工作流程:
浏览器访问服务器,服务器创建键值对的形式(cookie),
通过响应(响应头 set-cookie)返回给浏览器,
cookie保存在浏览器上,在下次访问的服务器时候,
根据 一定的规则 携带不同的cookie,不是所有的都会携带,
规则:当访问的url包含此cookie的path的时候,就会携带这个cookie;反之不会。
通过请求(请求头 cookie)携带,服务器就可以拿到这些cookie。
1 创建Cookie数据,发送到客户端,可以有多个cookie发送到客户端保存
[Java] 纯文本查看 复制代码
1 2 |
|
2 获取cookie: //不能获取指定的cookie 只能通过获取所有的cookie数据然后
[Java] 纯文本查看 复制代码
1 2 3 |
|
3 设置cookie有效期:不清除缓存的情况下,cookie数据默认保存在浏览器内存中,默认当浏览器关闭后cookie数据清除,
跟服务器是否正常关闭无关,数据存储在浏览器
如果设置了cookie的有效期,那么跟是否关闭浏览器无关
手动设置cookie有效期:cookie.setMaxAge(int 秒):设置Cookie的有效期是秒。
默认设置为负值,则为浏览器进程Cookie(内存中保存),关闭浏览器就失效
0秒就是删除该cookie(前提,必须路径相同),杀死cookie
[Java] 纯文本查看 复制代码
1 2 3 4 |
|
原理:浏览器接收到cookie后,会把数据持久的保存到磁盘上second秒,过期之前始终有效,无论浏览器是否关闭
a.相同键名的Cookie(值可以相同或不同)可以存在于不同的路径下。
b.删除时,如果当前路径下没有键为"key"的Cookie,则查询全部父路径,检索到就执行删除操作(每次只能删除一个与自己最近的父路径Cookie)
c.读取Cookie时只能读取直接父路径的Cookie。如果当前路径为/test/test2,要读取的键为"key"。当前路径读取后,还要读取/test,/test读取后,还要读取/
d.在做Java的web项目时,由于一般的Web服务器(如Tomcat或Jetty)都用Context来管理不同的WebApplication,这样对于每个Context有不同的Path,
在一个Server中有多个WebApplication时要特别小心,不要设置Path为/的Cookie,容易误操作。(当然前提是域名相同)
4 Cookie路径的设置:从项目名到资源名前.当访问的url包含此cookie的path的时候,就会携带这个cookie;反之不会
同一路径下不能有重名Cookie,有的话后边覆盖前面。不同路径下可以有重名Cookie。默认的cookie路径是在根目录下/day12
setPath(“路径”):cookie的路径被包含
cookie默认存储路径为:访问Servlet的路径的父路径 最后一级为资源名
一个路径不存在重名的cookie,不同路径下可以有重名的cookie。
[Java] 纯文本查看 复制代码
1 2 3 4 5 6 |
|
5 注意Cookie不能跨浏览器,不支持中文,如果想要想存储,先把中文用utf-8 编码存储乱码,再解码
response中多条set-Cookie设置
Session:服务器端的会话技术,底层依赖Cookie 把JseesionId写回浏览器,浏览器关闭后Session也不能使用;通过请求request获取
一次会话中仅存在一个session。只要这次会话存在session一直有效
[Java] 纯文本查看 复制代码
1 2 3 4 |
|
0 工作流程:
浏览器向服务器发送请求,服务器判断浏览器是否携带了唯一标识
若有唯一标识:
服务器会拿着唯一标识去session池中查询是否有对应的标识
若有:直接操作session对象,并把它存放到浏览器端
若无:服务器会为其创建一个私有的内存空间,可以操作session,把标识存放到浏览器端
若无唯一标识:
服务器会为其创建一个私有的内存空间,可以操作session,把它标识放到浏览器端,标识格式JSESSIONID=ASDHAJSADKASDA
1 获取session对象:
[Java] 纯文本查看 复制代码
1 2 3 |
|
2 session是一个域对象:
[Java] 纯文本查看 复制代码
1 2 3 |
|
生命周期:tomcat默认保存session的时间为30分钟,
使用request获取到的只是cookie的字符串,直接操作不会作用到浏览器的cookie,需要新new一个cookie去覆盖
创建:java中认为第一次调用request.getSession()时创建
销毁:1 服务器非正常关闭会销毁,没有来得及序列化
正常关闭,重启服务器都不会销毁。序列化和反序列化了
关闭浏览器再打开会消失,JsessionId丢失了,找不见了。session并未消失
2 超时: tomcat中设置的session默认存活时间是30分钟,配置在web.xml中
手动设置存活时间:setMaxInactiveInterval(int interval) //单位是秒
超时就会自动销毁
3 手动销毁:session.invalidate()
作用范围: 只在一次会话中有效。谁建立的会话在那个会话中有效。不会造成多个用户访问数据紊乱
因为底层依赖Cookie技术,所以默认浏览器关闭后也会失效。不能跨web应用。