Cookie&Session
会话技术
什么是会话?
会话指的是客户端和服务器交互通讯的过程。
什么是会话技术
HTTP 是一种无状态协议,每当用户发出请求时,服务器就会做出响应,客户端与服务器之间的联系是离散的、非连续的。当用户在同一网站的多个页面之间切换时,根本无法确定是否为同一用户。
Cookie
什么是Cookie
Cookie 实际上是小量信息,是由 Web 服务器创建的,将信息存储在用户计算机上的文件。当用户通过浏览器访问服务器的时候,浏览器会自动携带早前存储的 cookie,传递给服务器。
Cookie的分类
- 临时性 Cookie
浏览器退出后就会删除,cookie<0
- 持久性 Cookie
通过 setMaxAge 来设置 Cookie 的生命周期
Cookie的问题
- Cookie 的大小有限制,每个服务器最多不超过20个
- Cookie 是存放在客户端上的,信息不安全,有截获的可能,一般 Cookie 不会存放一些隐私数据
Session
什么是 Session
Session 是基于 Cookie 的一种会话机制。Session 服务器上的一段内存空间,可以用来存储数据
Cookie 是服务器返回一小份数据给客户端,并且存放在客户端上。 Session 是,数据存放在服务器端
Cookie 和 Session 的对比
- cookie
数据存放在客户端
数据不安全
减轻服务器压力,用户磁盘占用比较多
存放的数据有限
- Session
数据存放在服务器端
数据相对比较安全
服务器压力大一点
存放的数据依赖服务器的内存空间
3.Session 和 Cookie 的实验
-
实验一:打开浏览器,访问 Session 存值方法,不关浏览器,然后打开新的选项卡,接着访问 Session 取值方法,结果是新的选项卡可以看到数据
-
实验二:打开浏览器,访问 Session 存值方法,关闭浏览器,重新打开浏览器,接着访问 Session 取值方法,结果是无法看到数据
原因:
- 第一次访问:Session 没有创建,并且请求对象里面也不带任何的 cookie 过来。那么这个时候会在内存中创建一个新的 session 区域,并且把这个 session 的 id 值放到 cookie 里面给我们的浏览器返回,这些事情是服务器端自己做的,所以 cookie 是一个临时性的 cookie,关闭浏览器就销毁 cookie 了。
- 第二次访问:浏览器会把之前的那个 cookie 带过来,服务器收到了 cookie,里面有我们上次给的 sessionid 的值,那么这个时候再调用 request.getSession(),它先会拿我们带过来的 id,到内存里面去找有没有 session 的 id 值跟这个 cookie 带过来的一样,如果有,就直接返回这个内存空间,否则就创建新的 session 空间。
Session 销毁的细节
- 关闭浏览器并不能让 Session 销毁。因为 Session 是服务器的一块内存空间,它的销毁不依赖于客户端的浏览器关闭还是不关闭。
- 在此访问的时候,我们的浏览器已经没有了那个 Session id 的值,所以就找不到了以前的那块内存空间。所以打开浏览器重新访问,会拿到的是全新的 Session 空间。但是原来的那个 Session 还存在,只不过我们无法操作它
- 如果真的想操作以前的 Session,我们要手动往 cookie 里面存 Session id 的值,并且设置持久性 cookie。并且 cookie 的那个 name不能乱写,要写 JSESSIONID。
- 销毁 Session
- invalidate()
- 关闭服务器
- 自动失效。有效期默认30分钟
Session 的作用范围和生命周期
- 作用范围
一次会话范围内有效(不关闭浏览器)
- 生命周期
- 何时创建
第一次调用 request.getSession()就创建 - 何时销毁
关闭服务器
Session 超时了
调用 invalidate,让空间失效,作废
- 何时创建