技术设计

背景

我们需要对当前的 session 添加一个过期的功能,因为对于一个 session 他是不可能一直存在于后端的,往往在用户浏览完页面关闭浏览器后他就会失效。

需求

所以对于一般用户访问页面的时间长短,一般在 15-30 min 之间,在我们的 NIO server 中,我会将服务器的默认的 session 的过期时间设置成为 30 min,并且支持可配置化的 session ,可以在 config.json 中自由配置 session 的过期时间,支持秒级别的配置。

总结起来需求就是

  1. 支持 session 过期

  2. 可配置化的 session 过期时间

  3. 具有默认的过期时间(30min)

实现

session 过期

主要有两种方式

  • 开启线程去扫描 session 池中的 session:判断当前时间是否超过session 的过期时间,如果过期就将 session 从池中删除。

  • 使用懒计算的方式实现:当请求进来的时候才去计算 session 的时间,如果到了过期时间,就从 session 池中删除,如果没有到,就会一直存在于 session 池中。

简单分析一下两个方案,第一种方案,简单粗暴,有一个缺点就是始终要启动一个线程去扫描。第二种方案,采用懒计算的方式,将计算分配到每一次请求,相较于第一个方式性能较好,但是会牺牲一定的一致性,

这边主要采用的是使用第二种方案实现一个 session 的过期的机制。

支持可配置化的 session 过期时间

config.json 中多添加一个字段 sessionTimeout,在默认的情况下 sessionTimeout = 1800 。每次 session 创建的时候都会根据当前时间加上 session 的过期时间来计算出 session 过期时间。

Last updated

Was this helpful?