Laravel 11.9会话超时后Flash Session消息无法传递求助
会话超时后自定义提示消息无法显示的问题
问题描述
已实现会话超时后重定向至登录页,但无法成功显示自定义提示消息。预期效果为:用户会话超时后,后续请求跳转至登录页,并显示“您的会话已过期,请重新登录”的提示;实际仅完成跳转,提示消息始终不显示。
相关代码
composer.json
"require": { "php": "^8.2", "laravel/framework": "^11.9", "laravel/tinker": "^2.9", "laravel/ui": "^4.5" }, "require-dev": { "laravel/breeze": "^2.1" }
login.blade.php
<!DOCTYPE html> <html lang="en"> <head> <link rel="stylesheet" href="{{ mix('style.css') }}"> </head> <body> <section> <div id="form-container"> <form action="{{ route('login.submit') }}" method="POST"> ... </form> </div> </section> @if(session('error')) <div class="alert alert-danger"> {{ session('error') }} </div> @else <p>no problem here.</p> @endif </body> </html>
CheckSessionTimeout.php(中间件)
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Log; class CheckSessionTimeout { public function handle(Request $request, Closure $next): Response { if (Auth::check()) { $lastActivityTime = $request->session()->get('lastActivityTime', time()); $sessionTimeout = config('session.lifetime') * 60; if (time() - $lastActivityTime > $sessionTimeout) { Auth::guard('web')->logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect()->route('login')->with('error', 'Your session has expired. Please log in again.'); } $request->session()->put('lastActivityTime', time()); } return $next($request); } }
web.php(路由)
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\ProfileController; use App\Http\Controllers\LoginController; use App\Http\Controllers\RosterController; use App\Http\Controllers\Auth\AuthenticatedSessionController; use App\Http\Middleware\CheckSessionTimeout; require __DIR__.'/auth.php'; Route::get('/login', function () { return view('login'); })->name('login'); Route::post('/login', [LoginController::class, 'login'] )->name('login.submit'); Route::middleware([CheckSessionTimeout::class])->group(function () { ... Route::middleware('auth')->group(function () { Route::post('/logout', [AuthenticatedSessionController::class, 'destroy'] )->name('logout'); }); });
已尝试的方案
- 会话生命周期配置:设置固定时长,可稳定触发超时;
- 中间件代码检查:反复排查逻辑,确认无问题;
- Session Flash机制:尝试过
->flash()和->with(),当前使用->with(); - 中间件顺序检查:确认路由中中间件顺序无明显问题。
寻求解决该问题的方法。
内容的提问来源于stack exchange,提问作者Derrick
相关产品推荐
相关产品推荐

