You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 16:43:27