【问题标题】:Can't forget session from ajax request in laravel 5.2在 laravel 5.2 中不能忘记来自 ajax 请求的会话
【发布时间】:2016-08-29 23:30:30
【问题描述】:

我正在向我的控制器运行一个 jquery ajax 帖子,在那里我检查会话是否存在。如果是这种情况,我会读取值,忘记我的会话并将一些数据返回到视图。

如果我在使用忘记后在控制器功能中使用 session()->has,它将被删除。但是当我重新加载页面并再次执行 ajax 请求时,会话仍然存在。

在我的控制器中,我尝试通过忘记和拉动来删除它。

$request->session()->forget('last_history_id');
$request->session()->pull('last_history_id')

所以我的问题是,为什么我不能忘记我的 ajax 请求中的会话,所以它在下一页重新加载时消失了?

【问题讨论】:

  • 你在哪里设置这个会话值?也许重新加载页面会导致再次设置会话变量。
  • 这里不是这样,我在发布表单时设置会话,然后将用户重定向到我做 ajax 发布的列表。
  • 我怀疑您正在使用file 驱动程序进行会话,对吧?
  • 是的,这是正确的,文件驱动程序是否存在已知问题?

标签: php ajax laravel session laravel-5


【解决方案1】:

我建议在config/session.php 文件中将file 驱动程序更改为database 驱动程序(或文件以外的任何驱动程序)。

在使用file 和异步调用时,有一些known issues。我遇到了您遇到的确切问题,在切换到 database 后,问题得到了解决。

你可以很容易地切换到database。以下是docs 以获得更多帮助,以及下面的相关代码。

您需要设置一个表格来包含会话项目。您可以使用php artisan session:table 来生成迁移。然后只是composer dump-autoload,然后是php artisan migrate。这将为您在数据库中创建表。

最后,告诉 Laravel 你更喜欢这个驱动程序。根据您设置环境的方式,这可以硬编码在 config/session.php 中,也可以从您的 .env 文件中提取。

【讨论】:

  • 谢谢,它似乎是文件驱动程序和 laravel homestead 的组合,当部署到我的测试服务器时,这个问题就消失了。将尝试更新宅基地框,看看它是否会在更改为数据库驱动程序之前消失。
  • @tobros91 是的,这就是我从那篇长的 GitHub 帖子中收集到的内容。对我来说,一旦更改为数据库驱动程序,问题就解决了,但我不在 Homestead 工作,所以也许更新一下可能会对你的情况有所帮助。我为此追了半天的尾巴:)
  • @tobros91 对此有何更新?更新或切换到不同的驱动程序解决了吗?
  • 更新宅基地并没有解决我的问题。当运行多个异步 ajax 请求时,似乎 laravel 无法删除会话。我将 async 设置为 false 并确保在其他请求完成时始终运行此特定请求。
【解决方案2】:

这个问题可能和我的有关:

我最近遇到了一个问题,即在使用 AJAX 请求时session_id 发生了变化。可能当您检查会话时,它实际上是一个新会话。所以当你忘记它时,它对浏览器的主会话没有影响。

问题可能是路由上的web 中间件的双重绑定。我没有注意到 RouteServiceProvider 中已经应用了 web。在我的问题路线上删除 'middleware' => 'web' 后,这个问题就完全消失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2019-10-03
    • 2018-02-17
    相关资源
    最近更新 更多