Laravel 5.2-会话未在路线更改中持续


Laravel 5.2 - Session not persisting across route change

我刚刚安装了Laravel 5.2。我的项目进行了几个小时,我注意到会议并没有在不同的路线上持续。我第一次注意到这一点是在对表单使用Validation服务时。验证失败时,$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');
 }
}

Config/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,
];

你能试试这个吗?

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

如果您正在使用5.2中包含的默认Auth,请尝试执行以下操作:

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中间件,要么我错了?


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

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