资讯专栏INFORMATION COLUMN

Session过期策略研究

Zachary / 1265人阅读

摘要:走出误区,我们来讨论一下真正的过期策略吧。前面说了,数据是否过期只与服务器有关,此处在修改的过期策略配置三条红线分别影响着的过期策略删除几率的分子删除几率的分母分钟删除一次一次终上所述默认的过期机制为分钟删除一次,每个会话被删除的几率为。

首先说一点新手认识中常见的误区:关闭浏览器session就过期了。这种说话是完全错误的,

session是否过期与客户端如何操作没什么必然关系,他只与服务器如何设置有关。

以下观点以以PHP语言举例,使用的是chrome浏览器[48.0.2564.116 (正式版本) m (32 位)](△注意这点,因为Firefox浏览器关闭后PHPSESSID会强行缓存,测试会导致不准)
2016年10月21日新增:
edge关闭后PHPSESSID悔刷新
但chrome与firfox都不会了。
猜测后两个浏览器不会是为了用户体验考虑。

每个用户访问网站,服务器会自动赋予用户一个session_id值,此时服务器与客户端(此处为浏览器)同时拥有着一份相同值的session_id值。

往后的所有包含SESSION数据增加,修改,删除,过期一切都是以session_id值,为基础,session_id值,就是像一把钥匙,沟通客户端与服务器端之间关于SESSION的一切操作。

那”关闭浏览器session就过期了”这种网上普遍流传的观点是如何出现的呢?

首先说明的是,如果服务器代码不进行特殊操作,展示出来的效果确实是”关闭浏览器session就过期了”,譬如有些网站关闭浏览器再打开就要重新登录,但是这不代表session过期了,session_id值依旧存在于服务端,session_id所指向的值是依旧存在的,以下代码可以很好的证明这一点,我关闭了浏览器甚至切换了浏览器,b.php永远都会打印出那个数据。

a.php:


b.php:

只要在session_start()前给session_id赋上一个初始值,那么当前会话就会以那个session_id值作为钥匙,去像服务器要数据。

所以在此处,b.php的session_id永远是”5op1k5moghb1hprgkifgh7nv71“,那么只要服务器的session_id值不过期,这段数据永远可以获得得到。

一次session_start就是一次新的会话,如果没有经过特意赋值,那么将会产生一个新的session_id,新的session_id和原来的”5op1k5moghb1hprgkifgh7nv71“对不上,客户端自然获取不到对应的session数据啦,那么就会出现”关闭浏览器session就消失这个误区”。

走出误区,我们来讨论一下session真正的过期策略吧。前面说了,session数据是否过期只与服务器有关,此处在php.ini修改session的过期策略配置:

三条红线分别影响着session的过期策略

Session.gc_probability = 1 //session删除几率的分子

Session.gc_divisor=1000 //session删除几率的分母

Session.gc_maxlifetime=1440 //24分钟删除一次一次

终上所述:默认的session过期机制为 24分钟删除一次,每个session_id会话被删除的几率为1/1000。

我们可以手动将三行配置都改成1,进行测试,那么我们会发现即使不关闭浏览器session值也是会过期的。(session值默认要刷新一遍才过期,所以即便都设置成1也要手动刷新一遍,这和session本身的机制有关)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21487.html

相关文章

  • 签发的用户认证token超时刷新策略

    摘要:签发的用户认证超时刷新策略这个模块分离至项目权限管理系统与前后端分离实践,感觉那样太长了找不到重点,分离出来要好点。这样在有效期过后的时间段内可以申请刷新。 签发的用户认证token超时刷新策略 这个模块分离至项目api权限管理系统与前后端分离实践,感觉那样太长了找不到重点,分离出来要好点。 对于登录的用户签发其对应的jwt,我们在jwt设置他的固定有效期时间,在有效期内用户携带jw...

    e10101 评论0 收藏0
  • java | Spring Boot 与 Redis 实现 Cache 以及 Session 共享

    摘要:完成状态编写中已完成维护中原文是一个使用编写的开源支持网络基于内存可选持久性的键值对存储数据库维基百科是目前业界使用广泛的基于内存的数据库。 完成状态 [ ] 编写中 [ ] 已完成 [x] 维护中 原文 Redis Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库 ------ 维基百科 Redis 是目前业界使用广泛的基于内存的...

    ssshooter 评论0 收藏0

发表评论

0条评论

Zachary

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<