快速单击链接会导致注销(会话锁定?)
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()
中尝试断点来检查它是否被意外调用以及从哪里调用。
以上是关于快速单击链接会导致注销(会话锁定?)的主要内容,如果未能解决你的问题,请参考以下文章