【发布时间】: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 中。
编辑:将标题编辑得更准确。
【问题讨论】: