don*_*onk 13 php session session-cookies
假设有一个已登录成员区域的站点/系统,用户很少,但在使用站点/系统时非常不方便地注销.
由于用户没有闲置很长时间,因此会议到期.即使它们处于空闲状态,我也添加了一个定期的AJAX请求,即所谓的心跳,它会更新会话的访问时间和修改时间.每次用户点击某个内容或调用心跳时,我甚至都添加了一个触摸($ session_file).我也尝试重新生成会话ID.什么都没有帮助.
不幸的是,到目前为止,我无法在本地重现问题,因为当需求增加时,它经常发生.一些php.ini参数:
session.use_cookies = 1
session.use_only_cookies = 1
session.cookie_lifetime = 0
session.gc_probability = 1
session.gc_divisor = 1500
session.gc_maxlifetime = 10800
Run Code Online (Sandbox Code Playgroud)
由于会话和身份验证已经通过代码中的一个超级控制器处理,因此至少应该排除会话破坏.
通常只有登录页面会创建会话,因此此时您可以(并且应该)在内部添加已知值,例如会话ID.
其他页面(包括您的心跳)恢复现有会话,因此此时您将查找上述值; 如果它丢失了,你可以再做一些检查:
session_id()?对应?如果没有,会话文件由于垃圾收集而丢失.session.use_only_cookies设置.上述检查应该指向正确的方向.
所有提供的答案都显示了对问题的良好洞察力,但我只需分享我的确切问题的解决方案。我终于能够重现该问题并修复它。
所以系统包含两个子系统,比如说管理界面和客户端界面。当管理员在另一个选项卡中以客户端身份登录并以管理员身份登录时注销客户端界面时,管理员意外注销。这样做是因为所有内容都被写入带有命名空间的一个会话中。我所做的是删除在注销操作时不断破坏会话的代码,并将其替换为会话命名空间取消设置,并替换为仅有权访问登录页面的命名空间的来宾会话。