我的 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');
});
如果我访问 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 分钟(以秒为单位)时被初始化。
知道我做错了什么吗?
可能值得注意的是,我正在使用宅基地虚拟机(完全库存)对此进行测试。我也尝试过使用多个浏览器。没有任何 cookie 被发送到浏览器,我认为会话 ID 应该作为初始 get 请求的一部分发送到浏览器?
Laravel 的中间件 class \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
变量。
您可以在文档中阅读更多相关信息:
By default, the routes.php
file contains a single route as well as a route group that applies the web
middleware group to all routes it contains. This middleware group provides session state and CSRF protection to routes.
Any routes not placed within the web
middleware group will not have access to sessions and CSRF protection, so make sure any routes that need these features are placed within the group. Typically, you will place most of your routes within this group:
我有一个全新的 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 分钟(以秒为单位)时被初始化。
知道我做错了什么吗?
可能值得注意的是,我正在使用宅基地虚拟机(完全库存)对此进行测试。我也尝试过使用多个浏览器。没有任何 cookie 被发送到浏览器,我认为会话 ID 应该作为初始 get 请求的一部分发送到浏览器?
Laravel 的中间件 class \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
变量。
您可以在文档中阅读更多相关信息:
By default, the
routes.php
file contains a single route as well as a route group that applies theweb
middleware group to all routes it contains. This middleware group provides session state and CSRF protection to routes.Any routes not placed within the
web
middleware group will not have access to sessions and CSRF protection, so make sure any routes that need these features are placed within the group. Typically, you will place most of your routes within this group: