我的 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持续数据正在进行 - jquery ajax提交
laravel 4持续数据正在进行 - jquery ajax提交