【问题标题】:My Laravel 5.2.10 Sessions wont persist我的 Laravel 5.2.10 会话不会持续
【发布时间】:2016-04-29 18:08:24
【问题描述】:

我有一个全新的 Laravel 5 安装,事实上我已经在多个版本上尝试过这个并且一直遇到同样的问题。

除了将会话驱动程序设置为 redis 之外,我没有更改任何默认设置。 (基于文件的也有同样的问题)。

我有两条路线设置如下

Route::get('/set/{value}', function($value) {
    var_dump(Session::getId());
    Session::set('test', $value);
    return view('welcome');
});

Route::get('/get', function() {
    return 'Get ' . Session::get('test');
});

如果我访问 url /set/abc 我看到会话出现在 REDIS 中(我还看到使用基于文件时创建的文件)。会话在 REDIS 中看起来很好,如下所示

127.0.0.1:6379> KEYS *
 1) "laravel:1a3ae6caff6346e4a173fdc1ab4c6eb0f138806b"
 2) "laravel:fed1af2fb44c6e625953237c3fa6fcbb05366a5c"
 3) "laravel:cb37286ccfe3e7caa20557aca840f50cb5a5f20d"

但每次我访问该页面时,它都会重新创建一个新会话。

session.php文件的关键部分如下:

'lifetime' => 120,

'expire_on_close' => false,

我还在 REDIS 中检查了会话变量的 TTL,它们确实在 120 分钟(以秒为单位)初始化。

知道我做错了什么吗?

值得注意的是,我正在使用宅基地 vm(完全库存)来测试这一点。我也尝试过使用多个浏览器。从来没有向浏览器发送任何 cookie,我认为会话 ID 应该作为初始获取请求的一部分发送到浏览器?

【问题讨论】:

  • 这真的很奇怪......我正在尝试在本地复制这种行为。我想知道getId 方法是否做了一些讨厌的事情
  • @FBidu 我尝试过使用和不使用 getId 函数,它似乎并没有以任何方式影响它,我得到了同样的奇怪行为。
  • @FBidu 实际上getId 做了它所暗示的事情,仅此而已:)。
  • 我可以在这里复制问题!
  • @JonTaylor 似乎是!我无法以任何方式修复...

标签: php laravel session laravel-5 session-cookies


【解决方案1】:

Laravel 的中间件类 \Illuminate\Session\Middleware\StartSession 负责启动你的会话。在 L5.2 之前,这会在每个请求上运行,因为它是全局中间件堆栈的一部分。现在,它是可选的,因为 L5.2 希望在同一个应用程序中同时允许 Web UI 和 API。

如果您打开app/Http/Kernel.php,您会看到StartSession 中间件是名为web 的中间件组的一部分。您需要将所有路线放在那里,您的示例才能正常工作。

Route::group(['middleware' => ['web']], function () {
    Route::get('/set/{value}', function($value) {
        var_dump(Session::getId());
        Session::set('test', $value);
        return view('welcome');
    });

    Route::get('/get', function() {
        return 'Get ' . Session::get('test');
    });
});

您可以看到web 中间件组还负责其他事情,例如在所有视图上提供$errors 变量。

您可以在文档中了解更多信息:

默认情况下,routes.php 文件包含一个路由以及一个路由组,该路由组将web 中间件组应用于它包含的所有路由。该中间件组为路由提供会话状态和 CSRF 保护。

任何未放置在web 中间件组中的路由都将无法访问会话和 CSRF 保护,因此请确保将任何需要这些功能的路由放置在该组中。通常,您会将大部分路线放在该组中:

来源:https://laravel.com/docs/5.2/routing

【讨论】:

  • 太棒了,谢谢 Thomas,幸运的是,在您发布之前不久,我从 github 上的一个人那里得到了相同的答案 :),你们都是救生员。
  • 哦,好吧。 :) 我很高兴你把它整理好了。
  • 我遇到了同样的问题。虽然我的路线在组内的一个组中,该组有一个中间件web。那么我的路由不应该在网络中间件下吗?
  • @majidarif 不幸的是,我需要查看一些代码才能了解什么不起作用。最好用必要的代码打开一个新线程。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2018-06-25
  • 2019-01-05
  • 1970-01-01
  • 2017-02-16
相关资源
最近更新 更多