Laravel 4.1 - 多个 ajax 请求导致会话持久性失败

Posted

技术标签:

【中文标题】Laravel 4.1 - 多个 ajax 请求导致会话持久性失败【英文标题】:Laravel 4.1 - Multiple ajax requests causing session persistance to fail 【发布时间】:2014-07-24 18:09:34 【问题描述】:

我有一个页面让两个 ajax 请求被同一个事件触发,所以它们几乎是同步触发的。

这会导致 Laravel 4.1 出现一些问题。似乎 ajax 调用的每个请求都试图重写会话(我正在使用文件驱动程序),结果是写入了一个新会话,给我留下了两个会话文件,最新的一个是使用的。这个最新的没有会话数据,所以我的用户已注销。

从存储文件夹看来,每个 http 请求都会删除当前会话,然后重写一个新的会话文件。只要在重写会话之前没有另一个 http 请求就可以了。如果有另一个快速连续的请求(例如来自同一个页面的两个 ajax 调用在同一个事件上触发),则会话被破坏。我假设这是因为第二次调用会查找要持久的会话数据,但找不到。

我也尝试过 memcached 和 cookie 驱动程序,但我遇到了与文件驱动程序相同的问题。 我也尝试过使用 'return response::json(...)' ,正如我在论坛其他地方发现的建议解决方案一样,但没有任何乐趣。

有什么建议吗?我没有找到任何体面的解决方案。当然,Laravel 必须有一种方法来处理快速连续的请求并保持会话?

【问题讨论】:

从来没有遇到过向服务器发出高频请求的问题(构建一个带有大量 ajax 调用的 L4 应用程序)。 apache 服务器为每个请求(并行)创建一个新进程。我不知道它如何处理 IO 操作,但我认为它使用文件上的锁定状态来防止竞争条件。写的时候锁,写的时候解锁。也想使用该文件的请求(进程)等待直到它被解锁。所以我认为问题是别的。 当你在事件中为第二个ajax请求添加延迟时,它会起作用吗? setTimeout(function() your_ajax_call , 500);. @Sven - 是的,当我添加延迟时,问题就消失了。每次重新加载都会重写会话文件。会话文件在请求时被销毁,然后在响应时重新生成。这是 laravel 会话的正确行为吗? 那么你至少有一个解决方法;)我不知道 Laravel 会话过程,所以无法帮助你.. 【参考方案1】:

您应该使用 $.ajaxasync: false 选项。这将导致第二个 ajax 等待第一个 ajax 请求响应在它触发之前返回。使用setTimeout,如果第一次请求延迟导致连接问题,您将遇到问题。

您可以从http://api.jquery.com/jquery.ajax/this link查看完整的 $.ajax 文档

【讨论】:

您可以从this link查看完整的 $.ajax 文档

以上是关于Laravel 4.1 - 多个 ajax 请求导致会话持久性失败的主要内容,如果未能解决你的问题,请参考以下文章

使用 AJAX 的多个实时搜索 Laravel

在 Laravel 的 ajax 中显示多个输入数组验证

Laravel 4 如何使用 ajax 和 json 返回多个视图数据?

laravel 5中多个异步ajax请求中的CSRF令牌不匹配错误?

如何在 Laravel 5.2 中发送多个参数 AJAX

在laravel中收集多个数据并通过ajax发送