一、Session
1.1 概述和快速入门
概述:Session 是服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中
快速入门
- 获取 HttpSession 对象
- 使用 HttpSession 对象
常用方法
方法 | 作用 |
---|---|
HttpSession request.getSession() | 通过 request 对象获取 HttpSession 对象 |
Object getAttribute(String name) | 根据名称 获取属性值 |
void setAttribute(String name , Object value) | 设置 键值对在 Session 域中 |
void removeAttribute(String name) | 根据名称 移除键值对 |
1.2 Session 实现原理
Session 的实现是依赖于 Cookie 的。
服务器如何确保在一次会话范围内,多次获取的 Session 对象都是同一个呢?
- 使用 Cookie:服务器可以在客户端浏览器中设置一个唯一标识的 Cookie 对象,用于标识用户的会话。当客户端发起请求时,服务器可以根据该 Cookie 对象来识别用于的会话,并返回相应的 Session 对象
- URL 重写:服务器可以在每个页面的 URL 中添加一个唯一的会话标识符,以便在客户端发送请求时识别用户的会话,这样可以确保每次请求都能获取到相同的 Session 对象
- 隐藏表单字段:服务器可以在每个页面的表单中添加一个隐藏字段,用于存储会话标识符,当客户端提交表单时,服务器可以根据该字段来识别用户的会话,并返回相应的 Session 对象
1.3 Session 细节
1、当客户端关闭后,服务器不关闭,两次获取 Session 是否为同一个?
-
默认情况下,不是,但是我们可创建 Cookie 键为 JSESSIONID,并设置最大存活时间,让 Cookie 持久化保存
// 创建 Cookie 对象并存储唯一标识 Cookie cookie = new Cookie("JSESSIONID",session.getId()); // 设置 Cookie 对象的存活时间为 1个小时 cookie.setMaxAge(60*60); // 响应数据,发送 Cookie 对象 response.addCookie(cookie);
2、客户端不关闭,服务器关闭后,两次获取 Session 是否为同一个?
- 不是同一个,但是要确保数据不丢失,tomcat 自动完成以下工作(IDEA无法实现)
- Session 的钝化:在服务器正常关闭之前,将 Session 对象系列化到硬盘上
- Session 的活化:在服务器启动后,将 Session 文件转化为内存中的 Session 对象即可
3、 Session 什么时候被销毁?
- 服务器关闭
- Session 对象调用 invalidate() 方法
- Session 对象默认失效时间为 30 分钟
1.4 Session 特点
-
Session 对象用于存储一次会话的多次请求的数据,存储在服务器端
-
Session 对象可以存储任意类型,任意大小的数据
1.5 Session 和 Cookie 的区别
- Session 存储数据在服务器端,Cookie 存储数据在客户端浏览器中
- Session 没有数据大小的限制,而 Cookie 有数据大小限制
- Session 数据安全,Cookie 数据相对于来说不安全