会话重新生成导致快速AJAX调用的过期会话

Nic*_*ery 11 php ajax codeigniter

我的应用程序是一个完整的AJAX网页,使用Codeigniter Framework和memcached会话处理程序.

有时,它会发送大量异步调用,如果会话必须重新生成其ID(以避免会话固定安全问题),会话cookie的更新速度不够快,而且由于会话ID过期,某些AJAX调用失败.

这是我为清楚地显示问题所做的示意图: 在此输入图像描述

我走过了类似的线程(例如这个),但答案并没有真正解决我的问题,我无法禁用安全性,因为我的应用程序中只有AJAX调用.

尽管如此,我有一个想法,我希望在入侵Codeigniter会话处理程序类之前有一个意见:想法是管理2个同时会话ID一段时间,例如30秒.这将是最大请求执行时间.因此,在会话重新生成后,服务器仍将接受先前的会话ID,并切换到新的会话.使用相同的图片,如下所示:

在此输入图像描述

Vla*_*yga 1

您的问题似乎与请求的实际速度无关(尽管这是一个影响因素),但与并发性有关。如果我理解正确,您的 javascript 应用程序会进行许多(异步)ajax 调用 - 快速(可能是突发) - 有时其中一些会由于您认为是请求速度问题而导致会话失效而失败。好吧,我认为问题在于您实际上对服务器有多个并发请求,而第一个请求的会话已更新,另一个请求基本上看不到它,因为请求已经发出并等待服务器处理。

当然,只有当同时为同一用户发出多个请求时,这个问题才会显现出来。

现在真正的问题是 - 您的应用程序业务逻辑对此有什么要求?

在我看来,您正在尝试寻找“业务”问题的技术解决方案。我的意思是,要么您误解了您的要求,要么这些要求没有经过深思熟虑/指定。

我建议您尝试以下一些方法:

  • 问问自己这些多个同时发生的请求是否可以合并为一个

  • 深入研究需求并尝试找到你所做的事情的真正原因,也许这没有真正的商业原因

  • 每次在触发一系列请求之前,都会触发“刷新”ajax 请求以获取新会话,并且只有在成功后才继续处理所有其他请求

希望我写的一些内容可以帮助指导您解决问题。祝你好运

  • @NicolasThery 我个人不会实施你为 CI 提出的 hack。但如果您决定在服务器端无论如何都“修补”它,我会将其实现为“回旋余地”。这意味着,如果在过期后 1 分钟内发出会话已过期的请求,则无论如何都会让该请求通过。或者只是选择更简单的客户端“修复” - 在 ajax 调用周围创建一个包装器来检查会话过期,然后所有 ajax 调用都应该经过这一函数,并且它将负责处理会话刷新。 (2认同)