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

问题描述 投票:0回答:1

问题:

登录后,我快速点击以在新标签中打开多个链接,第一个工作正常,但后面的那些无法从会话中读取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 session cakephp locking cakephp-3.x
1个回答
1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.