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

Laravel中Page Expired异常处理:生产环境如何避免显示该提示?

解决Laravel生产环境中CSRF Token过期跳转提示的问题

这个坑我之前维护Laravel项目的时候踩过好几次!本质就是Laravel默认的CSRF Token有效期是2小时(120分钟),用户打开表单页面后搁那摸鱼半天再提交,就触发了这个安全校验。下面是几个生产环境里实用的解决办法,按需选就行:

1. 延长CSRF Token的有效期(最简单直接)

CSRF Token的有效期是跟会话(Session)绑定的,所以调整会话有效期就能同步延长token的有效期:

  • 打开项目根目录下的config/session.php,找到lifetime配置项,它默认是env('SESSION_LIFETIME', 120),把默认值改成你需要的分钟数,比如8小时就是480:
    'lifetime' => env('SESSION_LIFETIME', 480),
    
  • 👉 注意:这个配置会影响整个应用的会话有效期,别设得太长(比如几天),不然会有安全风险。后台管理系统设8-12小时差不多,前台用户系统建议3-4小时就够了。

2. 自动刷新CSRF Token(推荐给需要长时间停留的页面)

如果你的页面是那种用户可能蹲半天的(比如后台的内容编辑页、复杂表单页),用JS定时刷新token是最优解,不会影响全局会话,安全性更高:

  • 先在页面里加一段JS,每隔15分钟(或者你觉得合适的间隔)请求新的token,更新页面的meta标签和表单里的隐藏字段:
    // 每隔15分钟刷新一次CSRF Token
    setInterval(() => {
        fetch('/refresh-csrf')
            .then(res => res.json())
            .then(data => {
                // 更新meta里的token
                document.querySelector('meta[name="csrf-token"]').setAttribute('content', data.token);
                // 更新所有表单里的_token隐藏字段
                document.querySelectorAll('input[name="_token"]').forEach(input => input.value = data.token);
            });
    }, 15 * 60 * 1000);
    
  • 然后在routes/web.php里加一个返回新token的路由:
    Route::get('/refresh-csrf', function () {
        return response()->json(['token' => csrf_token()]);
    });
    
  • 👉 这个方法亲测有效,用户哪怕开着页面摸鱼一下午,提交表单也不会跳过期提示。

3. 自定义CSRF验证失败的响应(优化用户体验)

要是不想改有效期也不想加JS,那可以把默认的“页面过期”跳转改成更友好的提示,比如跳回表单页并显示错误:

  • 打开app/Exceptions/Handler.php(Laravel 10+的话,可能需要先在bootstrap/app.php里注册自定义异常处理),先引入异常类:
    use Illuminate\Session\TokenMismatchException;
    
  • 然后在register()方法里添加异常渲染逻辑:
    $this->renderable(function (TokenMismatchException $e, $request) {
        // 区分AJAX请求和普通表单请求
        if ($request->wantsJson()) {
            return response()->json([
                'message' => '会话已过期,请刷新页面后重试'
            ], 419);
        }
        // 普通表单请求,跳回上一页并带错误提示
        return back()->withErrors(['csrf_error' => '哎呀,会话过期啦,刷新页面再试试吧~']);
    });
    
  • 这样用户提交后不会被扔到陌生的过期页面,而是回到原来的表单页,看到更友好的提示,体验好很多。

4. 用API路由绕开CSRF验证(前后端分离项目专属)

如果你的项目是前后端分离的,表单提交走API的话,可以把相关路由放到routes/api.php里——API路由默认是不校验CSRF的,因为API通常用令牌认证(比如Passport、Sanctum)。不过要记得给API加好身份验证,别裸奔!

总结

  • 普通前台表单:适当延长会话有效期 + 自定义错误响应
  • 后台长停留页面:自动刷新CSRF Token
  • 前后端分离:用API路由+令牌认证

内容的提问来源于stack exchange,提问作者Birendra Gurung

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:18:17