【问题标题】:Laravel session driver database creates a new row every Ajax requestLaravel 会话驱动程序数据库为每个 Ajax 请求创建一个新行
【发布时间】:2021-08-04 03:55:57
【问题描述】:

我正在使用 laravel 开发一个应用程序。我需要将会话存储在数据库中,一切正常,直到我想在 Firefox 中进行测试。

当我在 Firefox 中登录用户时, 每个请求都会在数据库中创建一个没有 user_id 的新会话行。会话似乎工作正常,但我在每个请求中都会收到垃圾行。

Im getting a lot of trash rows here

这只发生在 Firefox 中, 我的 cookie 已启用,我在其他计算机上尝试并得到相同的结果。

我已经仔细检查了我的中间件、config/session.php 和 .env 文件。

kernel.php

protected $middlewareGroups = [
    'web' => [ 
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    'api' => [
        'throttle:60,1',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
];

/**
 * The application's route middleware.
 *
 * These middleware may be assigned to groups or used individually.
 *
 * @var array
 */
protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    'EscuelaEnPaquete'=>\App\Http\Middleware\EscuelaEnPaquete::class,
    'SesionesUsuario'=>\App\Http\Middleware\SesionesUsuario::class,
];

'SesionesUsuario'

        //Actualizamos la ultima interacción
    
    $actualmenor = \Carbon\Carbon::now()->subSeconds(env('MAX_seconds_IS_ALIVE'))->timestamp;
    $actual = \Carbon\Carbon::now()->timestamp;
    
    $sesion = Session::where('id',\Session::getId())->where("user_id",Auth::id())->first();


    if($sesion){
        
        $sesion = Session::find(\Session::getId());
        $sesion->last_activity =  $actual;
        
        if($sesion->login_on == null){
            $sesion->login_on = $actual;
        }
        
        $sesion->save();
    }
    
    //checamos si existe sesion
    
    $sesiones = Session::where("user_id",Auth::id())->where("id",'<>',\Session::getId())->count();
    
    if($sesiones >= env('MAX_SESSIONS')){
        //Camino: Eliminar sesion mas antigua
        
        $take = env('MAX_SESSIONS')-1;
        
        
        if(env('MAX_SESSIONS')-1 < 0){
            $take = 0;
        }

        $sesion_eliminar = Session::selectRaw('id as id_session')->where("user_id",Auth::id())->where("id",'<>',\Session::getId())->orderBy('login_on','DESC')->take($take)->get();
        
        $array_salvar_eliminar =[];
        
        foreach ($sesion_eliminar as $ident){
            array_push($array_salvar_eliminar,$ident->id_session);
        }
        
        array_push($array_salvar_eliminar,\Session::getId());
        
        //Quitamos sesiones sobrantes
        
        Session::where("user_id",Auth::id())->whereNotIn('id',$array_salvar_eliminar)->delete();
        
    }
    
    return $next($request);

中间件确实在工作,但我不能让垃圾会话进入数据库。

更新:好的,我进行了更深入的调试,并且仅在进行 ajax 调用时才添加额外的会话。

更新:这发生在所有浏览器中,但由于奇怪的原因,当我写这篇文章时它只发生在 Firefox 中。

编辑:将标题编辑得更准确。

【问题讨论】:

    标签: php laravel firefox


    【解决方案1】:

    Welp 经过大量研究,我发现了一些对遇到同样问题的人有用的东西。

    问题: ajax 调用中使用的路由是在 http 中而不是在 https 中。所以我得到了一个 跨域请求,laravel 将其解释为新会话。

    所以如果你遇到这种情况,你应该检查一些事情。

    1- 检查您的 htaccess : 你必须寻找这个

    RewriteEngine On
    
    RewriteCond %{HTTPS} !on
    RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    
    Our server doesn't had that configuration, so if you have permissions just add 
    those lines and will work.
    

    2- 如果您无法更改 httaccess

    如果不能修改httaccess,则必须添加

    \URL::forceScheme('https');
    

    到您的 app\Providers\AppServiceProvider 中的 boot() 方法。

    如果您的 $request->isAjax() 方法不起作用,这也会有所帮助。

    是的,这个问题毕竟是由服务器配置错误引起的。希望这对将来的人有所帮助。

    有关答案的更多信息,请查看:

    Laravel 5 - redirect to HTTPS

    【讨论】:

      猜你喜欢
      • 2016-08-07
      • 2011-05-15
      • 2019-06-05
      • 2021-06-15
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      • 2014-04-25
      • 2016-01-18
      相关资源
      最近更新 更多