我的 Laravel 5.2.10 会话不会持续

Posted

技术标签:

【中文标题】我的 Laravel 5.2.10 会话不会持续【英文标题】:My Laravel 5.2.10 Sessions wont persist 【发布时间】: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 似乎是!我无法以任何方式修复... 【参考方案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 不幸的是,我需要查看一些代码才能了解什么不起作用。最好用必要的代码打开一个新线程。 :)

以上是关于我的 Laravel 5.2.10 会话不会持续的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 4会话不会在页面加载过程中持续存在

用户登录后 Laravel 5 会话不会持续存在

laravel 4持续数据正在进行 - jquery ajax提交

laravel 4持续数据正在进行 - jquery ajax提交

如何在我的登录页面中禁用“Laravel 中的会话已过期”?

Laravel 4.1 身份验证会话数据不会跨请求持久化