会话 —— Session

目录

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。
sesson实现原理
服务器是如何确保在一次会话范围内,多次获取的session对象是同一个?
如上图:

  1. 服务器第一次获取session时,会在内存中创建一个新的session对象,并为session对象分配唯一的ID值;
  2. 响应时,服务器会把session的ID值在响应头中,发送到客浏览器。响应头 set-cookie: JSESSIONID=ID值
  3. 浏览器收到响应,保存cookie。当浏览器再次访问服务器其他资源时,会把JSESSIONID放在请求头中。请求头:cookie: JSESSIONID=ID值
  4. 服务器收到请求,当调用getSession()方法时,服务器会根据JSESSIONID查找到这个session对象。

从而,服务器确保了在一次会话范围内,多次获取的session对象是同一个。

4. 生命周期

  1. 服务器关闭
  2. session对象,调用方法:void invalidate(); 会被销毁
  3. session默认失效时间:30分钟。
  4. session失效时间,可以选择性配置,在项目的web.xml中修改:
<session-config>
	<session-timeout>30</session-timeout>
</session-config>

5. 特点

  1. session用于存储一次会话多次请求的数据,存在服务器端。用途很广泛,可以存储大量的数据。
  2. session可以存储任意类型,任意大小的数据:void setAttribute(String var1, Object var2);
  3. session与cookie的区别
    1. session存储数据在服务器端;cookie存储数据在客户端
    2. session存储数据没有大小限制,cookie有限制;
    3. session存储数据在服务器端更安全,cookie存储在客户端不安全

6. 其他

  1. 当客户端关闭后,服务器不关闭,两次获取的session是否为同一个?

①默认情况下,不是同一个。
②也可以相同。代码实现:

// 获取session
HttpSession session = request.getSession();

// 期望客户端关闭前与重新打开后获取的session相同
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60 * 60);// cookie存活时间1个小时
response.addCookie(cookie);
  1. 客户端不关闭,服务器关闭,两次获取的session不是同一个。

不是同一个。
若服务器关闭,再次启动后,如何确保数据不丢失?

  • session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上;
  • session的活化:在服务器启动后,将session文件转化为内存中的session对象;

猜你喜欢

转载自blog.csdn.net/weixin_41463971/article/details/88671636
今日推荐