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();
相关推荐
卡卡卡卡罗特38 分钟前
每日mysql
数据结构·算法
chao_7891 小时前
二分查找篇——搜索旋转排序数组【LeetCode】一次二分查找
数据结构·python·算法·leetcode·二分查找
aramae2 小时前
C++ -- STL -- vector
开发语言·c++·笔记·后端·visual studio
lifallen2 小时前
Paimon 原子提交实现
java·大数据·数据结构·数据库·后端·算法
lixzest2 小时前
C++ Lambda 表达式详解
服务器·开发语言·c++·算法
EndingCoder2 小时前
搜索算法在前端的实践
前端·算法·性能优化·状态模式·搜索算法
丶小鱼丶2 小时前
链表算法之【合并两个有序链表】
java·算法·链表
怀揣小梦想2 小时前
微服务项目远程调用时的负载均衡是如何实现的?
微服务·架构·负载均衡
不吃洋葱.3 小时前
前缀和|差分
数据结构·算法
GateWorld3 小时前
RISC-V:开源芯浪潮下的技术突围与职业新赛道 (二) RISC-V架构深度解剖(上)
架构·risc-v·指令集精简·寄存器设计·特权架构·模块化扩展