Servlet-会话管理
会话管理
HTTP是无状态协议
无状态即不保存状态,HTTP协议自身不对请求和响应之间的通信状态进行保存
会话管理的实现的手段
使用Cookie和Session配合解决
Cookie是在客户端保留少量数据的技术,主要是通过响应头向客户端响应一些客户端要保留的信息
Session是在服务端保留更多数据的技术,主要通过HttpSession对象保存一些和客户端相关的信息
Cookie和Session配合记录请求状态
Cookie
Cookie的创建
服务端创建Cookie,将Cookie放入响应对象中,Tomcat容器将Cookie转化为set-cookie响应头,响应给客户端
1 | |
Cookie的获取
在获取Cookie时,如果没有Cookie,Cookie数组为null 而不是 0
1 | |
Cookie的时效性
默认情况下Cookie的有效期是一次会话范围内,我们可以通过Cookie的setMaxAge()方法让Cookie持久化保存到浏览器上
- 会话级cookie
- 服务端没有明确指定Cookie的存在时间
- 在浏览器端,Cookie数据存在于内存中
- 只要浏览器还开着,Cookie数据都一直在
- 浏览器关闭,内存中的Cookie数据就会被释放
- 持久化Cookie
- 服务端明确设置了Cookie的存在时间
- 在浏览器端,Cookie数据会被保存到硬盘上
- Cookie 在硬盘上的存在时间根据服务端限定的时间来管控,不受浏览器关闭的影响
- 持久化Cookie到达了预设的时间会被释放
setMaxAge方法的参数设置单位时间是秒,如果参数为0,则表示要将此cookie删除
1 | |
Cookie的提交路径
我们设置的Cookie在浏览器中保存,但无论是访问哪一个网页都会携带这个Cookie
为了解决这个问题,我们使用setPath()方法设置Cookie的携带路径
1 | |
Session
Session是搭配Cookie使用的
Session用来在服务端记录客户端的某个状态,在用户访问服务端时被创建/找到
服务端在为客户端创建Session时,会同时将Session对象的id,即JSESSIONID以Cookie的形式放入响应对象
客户端在下次请求时携带JSESSIONID,服务端收到后,根据JSESSIONID找到相应的session对象
Session通常应用于记录用户的登录状态和用户的操作历史
Session也是域对象
Session的获取
在Servlet中获取Session的方法与Cookie不同,需要使用req调用getSession方法获取Session对象
1 | |
这个方法的执行步骤:
- 判断请求中有没有一个名为JSESSIONID的特殊Cookie
- 如果有,则根据JSESSIONID找对应的Session对象
- 找到对象后,将此对象返回
- 如果没找到,则创建一个新的Session返回,并且向response对象中存放一个JSESSIONID的Cookie
- 如果没有,则创建一个新的Session返回,并且向response对象中存放一个JSESSIONID的Cookie
- 如果有,则根据JSESSIONID找对应的Session对象
SessionAPI
| 方法名 | 说明 |
|---|---|
| getId() | 获取JSESSIONID |
| isNew() | 判断该Session是否为新建,而不是被找到 |
| setAttribute() | 存放键值对在Session中 |
| getAttribute(String key) | 根据键获取值的对象 |
注:Session中的值可以存放object类型,当我们知晓存入值类型可将他安全强转
Session的时效性
Session的时效性是30分钟,但有人访问后,会重新计时
我们可以在web.xml中设置Session的时效性
1 | |
我们可以在Sevlet中单独设置Session的时效性(以秒为单位)
1 | |