Laravel会话过期时用户会话的清除时机与对应代码如何定位?
Laravel 会话过期清理与登录重定向逻辑定位
会话过期判定、清理的核心代码位置
- 整个会话生命周期的管控核心是全局中间件
Illuminate\Session\Middleware\StartSession,这个中间件默认在app/Http/Kernel.php的web中间件组中加载,所有走web路由的请求都会先经过它。 - 你在
config/session.php设置的lifetime => 5配置,会在中间件启动会话时被读取,换算为秒数后和会话存储的最后活跃时间做比对:当当前时间与最后活跃时间的差值大于等于lifetime * 60时,框架会直接判定当前会话失效,调用会话实例的invalidate()方法清空该会话绑定的所有用户数据、生成新的会话ID。 - 全局过期会话的批量垃圾回收不是每次请求都会触发,触发概率由同配置文件的
lottery项控制,默认值[2, 100]代表每100次请求有2次概率触发批量删除所有已过期的会话记录,避免每次请求扫库带来的性能损耗。
未登录重定向的实现逻辑
- 会话清理本身不会直接触发重定向,跳转逻辑是认证中间件完成的:
- 当会话被清空后,请求走到需要登录权限的路由时,
Illuminate\Auth\Middleware\Authenticate中间件会检测到当前无已认证用户信息,直接抛出AuthenticationException。 - 这个异常会被
app/Exceptions/Handler.php中的异常处理逻辑捕获,走unauthenticated方法的分支:如果是普通网页请求,就直接重定向到登录页路由;如果是接口请求则返回401状态码。
- 当会话被清空后,请求走到需要登录权限的路由时,
确认触发时机的调试方法
你可以临时加日志追踪完整流程,调试完记得删除临时改动即可:
- 在
StartSession中间件的过期判定分支加日志,记录会话被判定过期、清理的时间点和会话ID - 在
Authenticate中间件的未认证分支加日志,记录检测到无登录态的时间点 - 在
Handler.php的unauthenticated方法里加日志,记录触发重定向的时间点
对应的临时调试代码示例:
// 会话过期判定处加日志 logger('会话已过期,开始清理', ['session_id' => $session->getId(), 'time' => now()]);
日志会统一写入storage/logs/laravel.log文件,你可以临时把会话生命周期设为1分钟测试,闲置超过1分钟后访问需要登录的页面,就能从日志里清晰看到整个流程的触发顺序和对应位置。
注意:不要直接修改vendor目录下的框架源码做长期业务定制,要改逻辑可以通过继承对应中间件、重写对应方法的方式实现,避免后续框架升级覆盖你的改动。
内容的提问来源于stack exchange,提问作者Kailas
相关产品推荐
相关产品推荐

