Laravel 5.2使用web中间件后,会话值仍不持久化

13
我有一个Laravel 5.2项目,用作我正在构建的javascript客户端的模拟API。模拟API功能将在以后用另一个Laravel项目替换。目前,我只需要能够提交API调用并获得预期的响应。
在我的模拟API中,我将身份验证状态存储在会话中。
我遇到的问题是,我放入会话中的值在http调用之间不会持久化。

session put is not persisting gif

这似乎与我找到的另一个stackoverflow帖子类似,但问题是我已经在我的API组中使用了web中间件。
我认为这可能是我的存储文件夹权限的问题(我正在使用默认的file会话驱动程序),vagrant是所有者并具有写入访问权限:

storage directory permissions

如果是权限问题,我认为它会生成一个运行时错误。还有其他什么我没注意到的吗?
编辑
这里是 Config::get('session') 的内容:

contents of config::get('session')

是的,StartSession 类被包含在 web 中间件组中:

StartSession class in web middleware group

这是浏览器会话 cookie 与在 Web 服务器上创建的会话文件的对比截图:

browser cookie vs session file

这是请求的内容:

request contents


我已经更新了我的问题,并附上了两个问题的答案。 - Chris Schmitz
清空 storage/framework/sessions 的内容并登录。您是否看到了一个新文件被创建了? - ceejayoz
是的,会创建会话文件。有趣的是,每次我刷新浏览器都会创建一个新的会话记录。难道它不应该创建并重复使用一个吗? - Chris Schmitz
Laravelй»ҳи®ӨдҪҝз”ЁеҗҚдёәlaravel_sessionзҡ„cookieпјҢиҖҢдёҚжҳҜPHPSESSIDгҖӮ - ceejayoz
1
在 Github 上添加了一个问题,https://github.com/laravel/framework/issues/11874 - Tania Petsouka
显示剩余12条评论
5个回答

8

我曾经遇到过同样的问题,通过替换以下内容,我成功解决了这个问题。

Route::group(['middleware' => ['web']], function () {
   ...
});

使用

Route::group(['middlewareGroups' => ['web']], function () {
   ...
});

不知道为什么,虽然所有的文档都建议我们使用['middleware' => ['web']],但这个方法确实有效。

这个有效。它应该是被接受的答案,因为它现在提供了所需的行为... - nonsensei
1
@ChrisSchmitz,这对我来说没有意义。对于Laravel 5.2,这是您问题的正确答案。您和我遇到的问题根源在于“web”中间件未加载。原因可能是文档错误或代码中的错误。迟早会被修复,但对于Laravel 5.2,这就是答案。如果您想使用'middleware'而不是'middlewareGroups',则必须编辑Laravel代码。但它将不再是版本5.2。无论如何,我至少会感谢他的努力并点赞,因为他节省了我们一些时间! - nonsensei
当我使用middlewareGroup建议时,出现了“Undefined variable: errors”的错误。 - Mandy
@nonsensei,看看我接受的这个答案:https://dev59.com/4FsW5IYBdhLWcg3wuZRy#39692060。这个答案解释了为什么,这(在我看来)比只给出如何更重要。这个答案让代码工作了,但我标记的那个答案帮助人们理解了为什么。没有不尊重howellmartinez,他的答案被正确地投票了,但被标记为正确的答案应该完全解释如何解决问题以及为什么。 - Chris Schmitz
@ChrisSchmitz,我们显然有不同的观点。 对我来说,目前被接受的答案从抽象的角度来看是“更好的”,但从具体的角度来看却不是! 现在“已经”修复和更新代码的答案对我没有价值。我可以很容易地自己找到它。当问题存在时,我需要一个答案,而howellmartinez指引了我正确的方向;他的答案对我很有价值。 此外,整个问题现在比以前价值更低。 对我的糟糕英语表示抱歉。 - nonsensei
显示剩余2条评论

1
我做到的一件事情是确保config/session.php中的域名设置为null。

1

我在5.2上遇到了同样的问题。

我发现如果我在一个组内注册路由和中间件,会使session正常工作。

Route::group(['middleware' => ['web']], function () {
    Route::get('aktuell', "SeitenController@getAktuell");
    # other routes ... 
});

但是如果我在控制器的构造函数中分配中间件,则不会起作用。
function __construct()
{
    $this->middleware('web');
}

(这是我首选的方法...)

通过显式保存会话来实现。

$request->session()->put("test3",time()."-anna");
$request->session()->save();

1
这是因为 Laravel 做了一个更改,所有默认路由都属于 "web" 中间件,所以在 routes.php 文件中再次分配它最终会分配两次。
解决方案要么从路由中删除 "web" 中间件,要么从 RouteServiceProvider 中删除自动分配。
Laravel 更新之前:
  // /app/Providers/RouteServiceProvider.php
$router->group(['namespace' => $this->namespace], function ($router) {
    require app_path('Http/routes.php');
});

在 Laravel 更新后:
// /app/Providers/RouteServiceProvider.php
$router->group([
    'namespace' => $this->namespace, 'middleware' => 'web',
], function ($router) {
    require app_path('Http/routes.php');
});

请注意,新的更新会自动将“web”中间件应用于所有路由。如果您希望像以前一样继续使用Laravel 5.2(在routes.php中手动分配“web”中间件),请在此处删除它。

但是在删除Web中间件会话后,session :: flash()无法显示消息。 - thedudecodes
非常有帮助,谢谢。 - ErvTheDev

0

我遇到了同样的问题,但其他答案都没有帮助到我。对我来说,Illuminate\Session\Middleware\StartSession 类始终被调用,因此我知道 Web 中间件已被调用。

在搜索该问题时,我发现了以下 thread,Taylor Otwell 在其中提到,在设置会话变量后,必须使用 Session::save()。使用这个方法对我有用,但我仍然不知道为什么这样解决了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接