目录
1. 概念
2. 基本操作
3. 实现原理
4. 生命周期
5. 特点
6. 其他
1. 概念
服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。
2. 基本操作
1. 获取HttpSession
HttpSession session = request.getSession();
2. 使用HttpSession
void setAttribute(String var1, Object var2); 存储数据
Object getAttribute(String var1);获取数据
3. 实现原理
Session的实现,依赖Cookie。
服务器是如何确保在一次会话范围内,多次获取的session对象是同一个?
如上图:
- 服务器第一次获取session时,会在内存中创建一个新的session对象,并为session对象分配唯一的ID值;
- 响应时,服务器会把session的ID值在响应头中,发送到客浏览器。响应头 set-cookie: JSESSIONID=ID值
- 浏览器收到响应,保存cookie。当浏览器再次访问服务器其他资源时,会把JSESSIONID放在请求头中。请求头:cookie: JSESSIONID=ID值
- 服务器收到请求,当调用getSession()方法时,服务器会根据JSESSIONID查找到这个session对象。
从而,服务器确保了在一次会话范围内,多次获取的session对象是同一个。
4. 生命周期
- 服务器关闭
- session对象,调用方法:void invalidate(); 会被销毁
- session默认失效时间:30分钟。
- session失效时间,可以选择性配置,在项目的web.xml中修改:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
5. 特点
- session用于存储一次会话多次请求的数据,存在服务器端。用途很广泛,可以存储大量的数据。
- session可以存储任意类型,任意大小的数据:void setAttribute(String var1, Object var2);
- session与cookie的区别
- session存储数据在服务器端;cookie存储数据在客户端
- session存储数据没有大小限制,cookie有限制;
- session存储数据在服务器端更安全,cookie存储在客户端不安全
6. 其他
- 当客户端关闭后,服务器不关闭,两次获取的session是否为同一个?
①默认情况下,不是同一个。
②也可以相同。代码实现:
// 获取session
HttpSession session = request.getSession();
// 期望客户端关闭前与重新打开后获取的session相同
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60 * 60);// cookie存活时间1个小时
response.addCookie(cookie);
- 客户端不关闭,服务器关闭,两次获取的session不是同一个。
不是同一个。
若服务器关闭,再次启动后,如何确保数据不丢失?
- session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上;
- session的活化:在服务器启动后,将session文件转化为内存中的session对象;