我的 Laravel 5.2.10 会话不会持续存在


My Laravel 5.2.10 Sessions wont persist

我有一个全新的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');
});

如果我访问网址/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 应该作为初始获取请求的一部分发送到浏览器?

Larawel 的中间件类'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