快速单击链接会导致注销(会话锁定?)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速单击链接会导致注销(会话锁定?)相关的知识,希望对你有一定的参考价值。

问题:

登录后,我快速点击以在新标签中打开多个链接,第一个工作正常,但后面的那些无法从会话中读取user,并导致应用程序认为“没有用户数据=没有访问权限,重定向登录“。

我被告知这可能是由于php的会话锁定。想法是第一页正在加载,并且通过这样做,正在阅读会话。在它完成之前,下一个尝试读取会话,但它仍然被第一个锁定。

如果您只需单击一个链接,然后单击其他链接,也会发生这种情况。因为第一个链接仍然命中服务器导致它锁定Session,所以当浏览器试图将你带到第二个时,它无法读取user并认为你没有登录。

这似乎是一个非常奇怪的默认行为,我不得不想象有人提出了一个不错的解决方案,而不是“只是不打开多个标签”和“单击链接时不要改变主意”。

这不会发生在我的CakePHP 2.x PHP 5.x应用程序上,但发生在我的CakePHP 3.x PHP 7.x应用程序上。

一个建议的解决方案:

有人告诉我试试Redis。虽然这听起来像是一个不错的解决方案(Redis没有锁定会话),但它会删除beneficial aspect of session locking并且似乎也不起作用。即使将CakePHP 3应用程序设置为使用redis进行会话,并验证它是否正在将会话数据写入redis,问题仍然存在。

问题:

处理这个问题的标准方法是什么?默认情况下,每个CakePHP 3.x应用程序是否确实存在此错误?

注意/附加小问题:

我注意到Cake存储在“CAKE”下的cookie值会在大多数页面加载时发生变化。该值是会话密钥(减去前缀)。这是否意味着它在每个页面加载时设置一个新会话?如果是这样,有什么理由吗?

答案

这不是PHP中会话锁定的工作方式,锁定的会话会阻止脚本执行,直到会话被解锁,它不会继续,并且不会让您没有会话访问权限或空会话。

如果您在每个请求上看到一个新的会话ID,那么这可能是问题(或其症状),即后续请求使用已经无效的会话ID,这肯定会让您留空会话,即您将成为登出。

通常会很少重新生成会话,例如登录/注销(以避免重放攻击)或会话超时时。作为一个起点,检查你的会话超时/生命周期配置(CakeNetworkSession::$_lifetime),也可以在CakeNetworkSession::renew()中尝试断点来检查它是否被意外调用以及从哪里调用。

以上是关于快速单击链接会导致注销(会话锁定?)的主要内容,如果未能解决你的问题,请参考以下文章

单击注销按钮终止会话并重定向到登录页面

PHP - 为啥我不能摆脱这个会话 id cookie?

快速会话不会注销

单击注销时如何从所有活动会话中注销?

按下锁定/主页按钮时的通知,单击返回选项卡片段时的通知

注销后的 CodeIgniter 后退按钮