【问题标题】:Laravel 5.2 Session values not persisting even when web middleware is used即使使用 Web 中间件,Laravel 5.2 会话值也不会持久化
【发布时间】:2016-04-11 00:31:16
【问题描述】:

我有一个 Laravel 5.2 项目,我将其用作我正在构建的 javascript 客户端的模拟 API。稍后将用不同的 Laravel 项目替换模拟 API 功能。现在,我只需要能够提交 API 调用并获得预期的响应。

在我的模拟 API 中,我将身份验证状态存储在会话中。

我遇到的问题是我放入会话中的值在 http 调用之间没有持久化。

这似乎类似于a different stackoverflow post I found,但问题是我已经在我的 API 组中使用了web 中间件。

我认为这可能是我的存储文件夹的权限(我正在使用默认的file 会话驱动程序),vagrant 是所有者并且具有写入权限:

另外,如果是权限问题,我认为它会产生运行时错误。

我还有什么遗漏的吗?

编辑

这是Config::get('session')的内容:

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

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

这是请求的内容:

【问题讨论】:

  • Config::get('session') 输出了什么,storage 中是否正在创建文件,您是否检查过会话中间件是否包含在 web 组中?
  • 我用这两个问题的答案更新了我的问题。
  • 清除storage/framework/sessions的内容并登录。您看到创建的文件了吗?
  • 是的,会话文件已创建。还有一些有趣的东西;每次我刷新浏览器时,都会创建一个新的会话记录。它不应该创建和重用一个吗?
  • 在 github 上添加了问题,github.com/laravel/framework/issues/11874

标签: laravel session laravel-5.2


【解决方案1】:

我遇到了同样的问题,并且能够通过替换来使其工作

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

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

虽然所有文档都建议我们使用 ['middleware' => ['web']],但不知道为什么会这样

【讨论】:

  • 这行得通。它应该是公认的答案,它现在给出了所需的行为......
  • 有趣的发现。我将对此进行深入研究,看看是否能找出原因。 @nonsensei,我没有将此标记为正确答案,因为它不完整。仅仅因为您拥有所需的功能并不意味着它是供人们参考的正确答案。我的前门有小溪,所以我完全把它从铰链上取下来-> 小溪停止了。仅仅因为它解决了问题并不意味着它是正确的答案。一旦豪厄尔/我/你/我们/其他人弄清楚修复的实际为什么如何,我会检查。我认为这是一个好的开始,但还不完全正确。
  • @ChrisSchmitz 这对我来说没有意义。这是 Laravel 5.2 问题的正确答案。您的问题(也是我的问题)的根源在于“网络”中间件未加载。原因要么是错误的文档,要么是代码中的错误。迟早它会被修复,但对于 Laravel 5.2 这就是答案。如果你想使用 'middleware' 而不是 'middlewareGroups' 你必须编辑 Laravel 代码。但它不再是 5.2 版了。无论如何,我至少会以赞成票感谢他,因为他付出了努力并为我们节省了一些时间!
  • @nonsensei,这是因为没有解释添加 middlewareGroups 的作用以及解决它的原因。很可能添加该值确实可以正确解决问题,但是说“不知道为什么会这样……”并不是一个完整的答案。如果答案是“这有效,因为......”并且解释了为什么你应该这样做并且理解了影响,我会给它检查。没有什么可以阻止你做建议的答案,但在我检查它之前表明 认为这是其他用户应该做的,我想进一步研究它
  • 我收到未定义变量:按照建议使用中间件组时出错。
【解决方案2】:

这是因为对 Laravel 进行了更改,默认情况下所有路由都是“web”中间件的一部分,因此在您的 routes.php 文件中再次分配它最终会分配两次。

解决方案是从您的路由中删除“网络”中间件或从 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');
});

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

【讨论】:

  • 但在删除 web 中间件 session::flash() 后无法显示消息
  • 真的很有帮助,谢谢
【解决方案3】:

对我有用的一件事是确保 config/session.php 中的域设置为空。

【讨论】:

    【解决方案4】:

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

    我发现如果我在一个组中注册路由和中间件,会话就可以工作

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

    但如果我在 Controllers 构造函数中分配中间件,则不会

    function __construct()
    {
        $this->middleware('web');
    }
    

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

    通过显式保存会话来工作

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

    【讨论】:

      【解决方案5】:

      我遇到了同样的问题,但其他答案都没有帮助我。对我来说,Illuminate\Session\Middleware\StartSession 类总是被调用,所以我知道 web 中间件被调用了。

      在搜索问题时,我遇到了以下thread,其中 Taylor Otwell 提到您必须在设置会话变量后使用Session::save()。使用它对我有用,但我仍然不知道这解决问题的原因。

      【讨论】:

        猜你喜欢
        • 2016-11-15
        • 2016-07-16
        • 2016-04-04
        • 1970-01-01
        • 2014-09-08
        • 2021-05-03
        • 2021-04-29
        • 2015-09-09
        相关资源
        最近更新 更多