Session的工作机制

Session的工作机制

  • 用户第一次请求服务器时,服务器端会生成一个sessionid
  • 服务器端将生成的sessionid返回给客户端,通过set-cookie
  • 客户端收到sessionid会将它保存在cookie中,当客户端再次访问服务端时会带上这个sessionid
  • 当服务端再次接收到来自客户端的请求时,会先去检查是否存在sessionid,不存在就新建一个sessionid重复1,2的流程,如果存在就去遍历服务端的session文件,找到与这个sessionid相对应的文件,文件中的键值便是sessionid,值为当前用户的一些信息
  • 此后的请求都会交换这个 Session ID,进行有状态的会话。

1、文字描述

前提:浏览器正常访问服务器

  • 服务器端没调用request.getSession()方法:什么都不会发生
  • 服务器端调用了request.getSession()方法
    • 服务器端检查当前请求中是否携带了JSESSIONID的Cookie
      • 有:根据JSESSIONID在服务器端查找对应的HttpSession对象
        • 能找到:将找到的HttpSession对象作为request.getSession()方法的返回值返回
        • 找不到:服务器端新建一个HttpSession对象作为request.getSession()方法的返回值返回
      • 无:服务器端新建一个HttpSession对象作为request.getSession()方法的返回值返回

2、流程图描述

3、代码验证

实现步骤

1.调用request对象的方法尝试获取HttpSession对象 2.调用HttpSession对象的isNew()方法 3.打印HttpSession对象是否为新对象 4.调用HttpSession对象的getId()方法 5.打印JSESSIONID的值

javascript 复制代码
// 1.调用request对象的方法尝试获取HttpSession对象
HttpSession session = request.getSession();

// 2.调用HttpSession对象的isNew()方法
boolean wetherNew = session.isNew();

// 3.打印HttpSession对象是否为新对象
System.out.println("wetherNew = " + (wetherNew?"HttpSession对象是新的":"HttpSession对象是旧的"));

// 4.调用HttpSession对象的getId()方法
String id = session.getId();

// 5.打印JSESSIONID的值
System.out.println("JSESSIONID = " + id);

4、时效性

①为什么Session要设置时限

用户量很大之后,Session对象相应的也要创建很多。如果一味创建不释放,那么服务器端的内存迟早要被耗尽。

②设置时限的难点

从服务器端的角度,很难精确得知类似浏览器关闭的动作。而且即使浏览器一直没有关闭,也不代表用户仍然在使用。

③服务器端给Session对象设置最大闲置时间

  • 默认值:1800秒

最大闲置时间生效的机制如下:

④代码验证

实现步骤

1.测试时效性 2.获取默认的最大闲置时间 3.设置默认的最大闲置时间

javascript 复制代码
// ※测试时效性
// 获取默认的最大闲置时间
int maxInactiveIntervalSecond = session.getMaxInactiveInterval();
System.out.println("maxInactiveIntervalSecond = " + maxInactiveIntervalSecond);

// 设置默认的最大闲置时间
session.setMaxInactiveInterval(15);

⑤强制Session立即失效

javascript 复制代码
session.invalidate();
相关推荐
画个大饼1 小时前
Go语言实战:快速搭建完整的用户认证系统
开发语言·后端·golang
不爱学英文的码字机器3 小时前
零信任架构:重塑网络安全的IT新范式
安全·web安全·架构
ShiinaMashirol4 小时前
代码随想录打卡|Day27(合并区间、单调递增的数字、监控二叉树)
java·算法
wuqingshun3141596 小时前
蓝桥杯 5. 交换瓶子
数据结构·c++·算法·职场和发展·蓝桥杯
Demons_kirit6 小时前
Leetcode 2845 题解
算法·leetcode·职场和发展
却道天凉_好个秋6 小时前
系统架构设计(二):基于架构的软件设计方法ABSD
架构·系统架构
泯泷6 小时前
「译」解析 JavaScript 中的循环依赖
前端·javascript·架构
抹茶san6 小时前
前端实战:从 0 开始搭建 pnpm 单一仓库(1)
前端·架构
adam_life7 小时前
http://noi.openjudge.cn/——2.5基本算法之搜索——200:Solitaire
算法·宽搜·布局唯一码
iuyou️7 小时前
Spring Boot知识点详解
java·spring boot·后端