JavaWeb这个时间有点久了,不能学了前面忘后面,是时候总结一下了
Cookie
cookie由服务器生成,发送给浏览器,保存在浏览器上。
cookie生命周期
-
会话级别: 本次浏览器关闭
- 保存在 浏览器内存中的cookie(默认)。 特点:浏览器关闭,cookie就会销毁
-
持久化级别: cookie的存活时间过期
- 保存在浏览器对应的 硬盘 上。特点:浏览器即使关闭,cookie也会保存下来(cookie的销毁与浏览器是否关闭无关,和cookie的存活时间有关)
-
setMaxAge(int expiry) 设置cookie的存活时间。 秒
-
-1 默认。保存在浏览器的内存中
浏览器关闭cookie销毁
-
0 让cookie立即销毁
1970年1月1日就过期
-
>0 的正整数
只要正整数大于0的,就会存活在浏览器对应的硬盘上,不以浏览器的关闭为销毁。而是时间到期,就会自动销毁
-
Session
保存在服务器的会话技术。
Session原理
举个例子:银行账户是一个 session,银行卡是一个 sessionid,卡本身是一个cookie,卡里面存了一个 sessionid
当你首次访问服务器时,服务器为你创建了一个 session,并且给了你一个sessionid,让你带走。session 就相当于一个银行账号,sessionid 相当于一个唯一标识,它放到了一个 cookie 里面让你带走,你(客户端) session 里面的东西都寄存在服务器端,我不动它,当需要用的时候,sessionid 给服务器,服务器里面的东西,就都可以拿出来。一旦中途关闭了浏览器,里面的 cookie 就没了。这时候服务器会帮你再创建一个 sessionid (相当于办卡),把一个新 sessionid 分配给你让你带走,原先的 session 还在服务器端,但是没有人能够获取到它,因为没有对应的sessionid 就没法找到这个 session。时间一久(默认三十分钟,session 最大不活动时间),服务器看到这个 session 没人用就扔了。
session生命周期
创建:第一次调用 getSession() 创建
销毁:
1、服务器非正常关闭
服务器正常关闭时,session对象会序列化方式保存到硬盘上。下次服务器正常启动时,硬盘数据就会回到内存中。
2、主动调用 session对象.invalidate()
3、超过 30 分钟没有调用 session
Session 和 cookie 区别
cookie是浏览器技术, 是服务器发送过来的, 保存在浏览器
session是服务器技术, 数据保持在服务器,通过cookie与浏览器建立联系, 保证用户在切换页面时保持会话
区别:
- cookie只能存储英文字符串, session可以存储任意数据
- cookie只能存储少量数据,session可以存储大量数据
- cookie默认生命周期是当前会话, 关闭浏览器自动销毁, session默认生命周期是30分钟
扩展题:浏览器关闭并重新开启,之前的 session 是否立即销毁?为何获取不到浏 览器关闭之前的 session 数据?
详解:
session 依赖于 cookie 通过 JSESSIONID 传递 session 的 id
getSession()时,通过 JSEESSIONID 的 cookie 寻找已有的 session 对象。
浏览器关闭时,JSESSIONID 是会话级别 cookie,被浏览器删除了。
再次开启浏览器向服务器发送请求时,因为没有 JSESSIONID 的 cookie,getSession()会创建了一个新 session,新 session 没有之前的数据。