Cookie
协议状态
有状态:有储存数据的功能,服务器可以通过协议判断和上一个请求的关系
无状态:没有储存数据的功能,服务器不能仅通过协议判断和上一个请求的关系,我们常用的HTTP协议就是无状态的协议,但是我们可以通过一些手段(加请求头)转换为有状态
传递流程
1、Client发送HTTP请求给Server,Server判断本次请求是否带有Cookie
2、如果没有携带Cookie,Server会在本次响应头中携带Set-Cookie响应头,将Cookie信息存在这个响应头中
new Cookie(key,value)(value默认是英文,其他字符需要使用URLEncode.encode())-->addCookie
3、Client一旦读取到响应头中的Set-Cookie,就会创建一个Cookie(File)并储存在浏览器中,之后请求Server的时候会再次把Cookie信息放在请求头(Cookie)中
4、Server通过读取请求头中携带的Cookie来判断两次请求是否为同一人操作
getHeader("Cookie"):获取本次传递的Cookie的value,Decode.encode:解码字符
resp.getCookies():获取前端传递的所有Cookie
Cookie的生命周期
客户端收到响应头SetCookie时创建,默认情况下浏览器关闭时销毁,其次以设置过期时间为准(setMaxAge(int expiry)设置Cookie的过期时间(s)手动销毁/替换),删除Cookie时,该Cookie必须匹配当时的携带路径)
setPath("/")设置Cookie的路径为全局,默认的Cookie路径是当前Servlet所在的路径
Session
Session与Cookie不同,Cookie会将数据存放在浏览器磁盘中,键和值都是,Session是属于服务器端的会话,数据保存在服务器的内存中 ,每个会话中会保存自己的数据,其他会话不能访问,不能共享
常用方法
如果不存在就创建:req.getSession
获取SessionID,唯一的32位十六进制数:getId()
Session创建时间:getCreationTime()
上次访问的时间:getlastAccessedTime()
判断Session是否为新创建:isNew
setAttribute(key,value):存键值对,value存的是Java对象,可以存储中文
getMaxInactiveInterval:获取Session剩余的时间(默认1800s)
invalidate:立即销毁
生命周期
在服务器获得新会话请求时/找不到相同SessionID时通过getSession()创建
默认无操作30分钟后销毁/在服务关闭时销毁
(浏览器上的SessionID是储存在Cookie中的,随着浏览器的关闭销毁Cookie,SessionID也一同销毁,因此服务器无法判断这是同一次会话,下次访问会创建新的Session,可以通过创建Cookie(key为JSESSIONID)时附加销毁时间来延时销毁)
传递流程
1、第一次请求如果没有携带Cookie中的Session信息,服务器就调用setSession方法,创建Session,通过Cookie发送给浏览器
2、浏览器获得SessionID,下次访问回发给服务器
3、服务器通过Cookie中的ID与Session中的ID进行对比,访问同一个会话中的数据,不会再次给浏览器回发
Session的持久化
方法1:
持久化Cookie
方法2:
序列化Session
对象必须实现Serializable接口
钝化:从内存到磁盘
活化:从磁盘到内存
invalidate删除也会将磁盘中的文件删除
Cookie和Session的区别
Cookie是存在客户端的,Session是存在服务器的,在客户端上保存的Session是保存在Cookie文件之内的,客户端单方面销毁Cookie文件并不会销毁Session本体
Cookie只能存储字符串,Session可以存储任意对象
Cookie的创建是客户端收到的响应报文中包含setCookie响应头就会创建,Session的创建是服务器通过getSession来获取新的Session,再通过响应报文中的Cookie发送给客户端
Cookie的销毁是默认随着浏览器关闭而销毁,Cookie可通过setMaxAge方法延长销毁时间,Session的销毁默认是无操作30分钟后销毁,也可以通过invalidate方法或者关闭服务器来销毁
Cookie储存在磁盘,Session储存在内存(可持久化到磁盘)