php-多个(已取消)POST请求后会话丢失
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php-多个(已取消)POST请求后会话丢失,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2523字,纯文字阅读大概需要4分钟。
内容图文
我们正在使用带有Memcached的外部Ubuntu服务器进行会话存储.由于我们已从数据库会话切换过来,因此我们收到了被注销用户的随机投诉.
问题:
>用户将在会话到期前被注销.在某些情况下,他们在登录后一两分钟就会被注销.
>我们的Web服务器日志或Memcached日志中没有出现错误.
>他们的会话ID在注销后保持不变.
今天,我们的一位用户偶然发现了一种重现该行为的方法.在允许他们设置自定义日期范围的页面上,他们反复按下“前一天”按钮,每次单击都会发出POST请求.例如,如果您单击所说的按钮20次,它将发出20个POST请求,其中19个将在成功完成最后一个请求之前被取消.最终请求完成后,似乎所有会话变量都丢失了.
我的php.ini(CGI)设置:
session.save_handler = memcache
session.save_path = "tcp://OURSERVERIP:11211?persistent=1&weight=1&timeout=1&retry_interval=15"
注意:POST请求正在同一域上加载iframe.
更新:用户彼此登录似乎也出现了问题.会话ID冲突?
解决方法:
我已经对您发布的所有内容进行了一些研究,以下是一些固定点:
会话ID冲突
根据This article,有37 ^ 31个不同的会话ID.根据birthday paradox,您将需要进行2E24次会话才能有50%的机会发生一对冲突.您会看到机会极低,但可能.例如,如果您将会话ID存储在数据库中,然后再将其移交给用户,以便他们可以使用相同的会话ID一年或更长时间,则机会会增加.
多个同时的会话请求
在这一点上,我不确定“前一天”按钮是否发送了ajax请求,以便用户可以连续多次单击它而不等待结果,或者他需要等待(至少部分)页面加载才能再次单击该按钮在新加载的页面中.在第一种情况下,可能会发生这样的情况:数据包可能会在Internet中被扰乱,最后发送的请求将比其他请求更快地到达.现在,当两个请求同时到达时会发生什么?根据this SO问题,会话数据被锁定,直到(通常)脚本完成执行.这会导致多个请求堆积在队列中,因此应该是安全的,并且不会导致会话丢失.
脚本特定时间的弱点
这是最后一个要点,根据您的信息,我相信这是您会话丢失的原因.这取决于服务器的实现方式,但是如果第十个“前一天”请求在第五个之前到达会怎样?第二个可能的原因是中断页面加载.使用ajax加载不会发生这种情况,但是使用常规格式会发生这种情况.如果在页面加载(并且可能仍在执行)之前单击前一天,则Web浏览器会中断加载并请求新页面. php脚本的执行应为aborted.现在,根据session_write_close,无论何时脚本终止,都会调用该函数,因此在这种情况下,它仍然是会话安全的.那么问题出在哪里呢?可能再次在脚本中.想象一下,您的php脚本将在中间停止执行,并立即保存会话.会发生什么?这取决于.取决于您如何处理会话,在会话中存储什么以及何时存储会话.它基本上可以在添加(回显)输出的任何行上消失,因为那是因为它发现客户端浏览器不再监听该连接.
我相信这是原因,我可能是错的,因为只有您才能看到您的代码.我建议您检查一下代码,并检查如果脚本提前终止或接收到请求混乱的情况,会发生什么情况.
编辑
我忘了记下Memcache.不幸的是,我对此一无所知,因此标记了一些不正确的内容,但并未从此答案中删除,这是因为休息可能仍然是正确的原因.
内容总结
以上是互联网集市为您收集整理的php-多个(已取消)POST请求后会话丢失全部内容,希望文章能够帮你解决php-多个(已取消)POST请求后会话丢失所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。