【问题标题】:Laravel 5.2 - Session not persisting across route changeLaravel 5.2 - 会话不会在路由更改中持续存在
【发布时间】:2016-04-13 21:33:39
【问题描述】:

我刚刚安装了 Laravel 5.2。我进入我的项目几个小时,我注意到会话不会跨路线持续存在。在表单上使用验证服务时,我首先注意到了这一点。 $error 变量在验证失败时为空。

我创建了两条简单的路线来重现该问题。代码如下。 Foo 路由加载会话,但 Bar 路由不加载。

  • Laravel.log 为空。
  • sudo chmod -R 777 设置在存储上
  • 我试过数据库驱动和文件驱动。结果相同。
  • 我已更新数据库以包含会话表更改(用户 ID 等)
  • php artisan cache:clear
  • php artisan config:clear
  • 使用文件驱动程序时,我看到会话文件存储在storage/framework/sessions
  • 我有一份来自 5.2 存储库的 app/Http/Kernel.php 的新副本

Routes.php

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


    Route::get('foo','AuthController@foo');
    Route::get('bar','AuthController@bar');


});

AuthController.php

namespace Zocial\Http\Controllers;

class AuthController extends Controller
{

 public function foo()
 {
  \Session::put('user','testing');

  //session( ['user' => 'testing'] ); not working either
  return \Session::get('user');
 }

 public function bar()
 {
  return "Session here: " . \Session::get('user');
 }

}

配置/session.php

return [

    'driver' => env('SESSION_DRIVER', 'database'),
    'lifetime' => 120,
    'expire_on_close' => false,
    'encrypt' => true,
    'files' => storage_path('framework/sessions'),
    'connection' => env('DB_CONNECTION','mysql'),
    'table' => 'sessions',
    'lottery' => [2, 100],
    'cookie' => 'laravel_session',
    'path' => '/',
    'domain' => env('APP_DOMAIN', null),
    'secure' => false,

];

【问题讨论】:

  • 在使用文件驱动程序时,您是否看到会话文件正在storage/framework/sessions 目录中创建?
  • 你安装了新的 Laravel 5.2 应用还是从以前的版本进行了更新?
  • 您能否确保您拥有有效的app/Http/Kernel.php 文件结构?默认是github.com/laravel/laravel/blob/master/app/Http/Kernel.php
  • 这个问题有什么解决办法吗?我也面临同样的问题。
  • 我从头开始创建了一个新的 Laravel 5.2 产品,并将一个模块一个模块地复制到新项目中,现在有了一个带有工作会话的复制项目。我从来没有弄清楚根本原因。

标签: php laravel laravel-5.2


【解决方案1】:

我注意到如果 config/session.php 下的“安全”设置为 true,并且您没有通过 HTTPS 访问您的站点,会话不会持续存在。我通过将 'secure' 设置为 false 解决了这个问题。

【讨论】:

    【解决方案2】:

    如果您使用的是 5.2 中包含的默认身份验证,请尝试这样做:

    php artisan make:auth
    

    这将重新创建您的身份验证控制器以及 laravel 5.2 包含的标准身份验证附带的所有其他内容。

    这是唯一对我有帮助的事情。 (在我将会话设置为数据库后它停止工作......)


    更新 1

    显然,当您在 routes.php 中定义了使用“web”中间件的路由时,它会将您从应用程序中注销并给您一个令牌不匹配。

    像这样:(注意下面的代码不起作用)

    Route::auth();
    
    Route::get('/home', 'HomeController@index');
    
    
    Route::group(['middleware' => 'web'], function() {
        Route::get('/', function () {
            return view('welcome');
        });
    });
    

    转到您网站的根目录会注销您,当您再次到 /home 时,您将被重定向到登录。如果您再次尝试登录,则会出现令牌不匹配的情况。

    以下内容阻止了错误的出现:

    Route::auth();
    
    Route::get('/home', 'HomeController@index');
    
    Route::get('/', function () {
        return view('welcome');
    });
    

    要么我不理解新的中间件,要么它不起作用,因为我的“/”路由应该使用网络中间件还是我错了?


    解决方案: 您需要从您的路由/路由组中删除 Web 中间件,因为从 5.2 开始自动添加 Web 中间件,这也是我遇到问题的原因。

    【讨论】:

      【解决方案3】:

      你可以试试这个吗?

      public function foo(Request $request)
      {
          $value = $request->session()->put('key', 'value');
      
      }
      
      public function bar(Request $request)
      {
          $value = $request->session()->get('key');
          return $value;
      }
      

      【讨论】:

      • 当然。我相信你的第一个方法应该是foo。所以我已经更新了你的代码。我得到与我的示例相同的结果。会话未返回。
      猜你喜欢
      • 2017-02-08
      • 2017-02-16
      • 2016-01-20
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 2016-11-15
      • 2014-05-27
      相关资源
      最近更新 更多