我的Laravel 5.2.10 Sessions不会坚持下去

Jon*_*lor 8 php session session-cookies laravel laravel-5

我有一个全新的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');
});
Run Code Online (Sandbox Code Playgroud)

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

127.0.0.1:6379> KEYS *
 1) "laravel:1a3ae6caff6346e4a173fdc1ab4c6eb0f138806b"
 2) "laravel:fed1af2fb44c6e625953237c3fa6fcbb05366a5c"
 3) "laravel:cb37286ccfe3e7caa20557aca840f50cb5a5f20d"
Run Code Online (Sandbox Code Playgroud)

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

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

'lifetime' => 120,

'expire_on_close' => false,
Run Code Online (Sandbox Code Playgroud)

我还在REDIS中检查了会话变量的TTL,它们确实在120分钟时初始化(相当于秒).

知道我做错了什么吗?

值得注意的是,我正在使用宅基地vm(完全库存)来测试这一点.我也试过使用多个浏览器.没有cookie被发送到浏览器,我假设会话ID应作为初始get请求的一部分发送到浏览器?

Tho*_*Kim 8

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');
    });
});
Run Code Online (Sandbox Code Playgroud)

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

您可以在文档中阅读更多相关信息:

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

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

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