2016-01-23 135 views
7

我有一个全新安装的Laravel 5,事实上,我已经尝试了多个版本并继续触及相同的问题。我的Laravel 5.2.10会话不会持久

除了将会话驱动程序设置为redis之外,我没有更改默认设置。 (基于文件也有相同的问题)。

我有两条路线设置如果我访问的URL /设置/ ABC我看到会话出现在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'); 
}); 

(我也看到了使用基于文件时创建的文件)。在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(完全股票)来测试这个。我也尝试使用多个浏览器。没有cookies被发送到浏览器,我认为会将session ID作为初始获取请求的一部分发送给浏览器?

+0

这真的很奇怪......我想在本地复制行为。我想知道'getId'方法是否会产生令人讨厌的效果 – FBidu

+0

@FBidu我尝试过并没有getId函数,它似乎没有以任何方式影响它,我得到了相同的奇怪行为。 –

+0

@Fidu实际上['getId'](https://github.com/laravel/framework/blob/5.2/src/Illuminate/Session/Store.php#L162-L165)做它意味着它所做的事,除此之外: )。 – Bogdan

回答

6

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

+0

辉煌,谢谢托马斯,我很幸运地从github上的家伙得到了同样的答案,在你发布之前不久),你们都是生活储户。 –

+0

哦,好的。 :)我很高兴你把它整理出来。 –

+0

我遇到同样的问题。尽管我的路线位于具有中间件“web”的组内。那么我的路线不应该在网络中间件之下吗? – majidarif