Laravel 5.4会话变量刷新页面后丢失问题求助
解决Laravel重定向后会话变量刷新丢失的问题
我之前也碰到过几乎一模一样的坑,咱们一步步拆解问题并解决:
核心原因分析
你手动调用Session::save()的操作大概率是罪魁祸首。Laravel的web中间件组已经包含了StartSession中间件,它会在整个请求周期结束时自动处理会话的保存工作——包括重定向响应的场景。你提前手动调用Session::save(),会和框架的自动保存流程冲突,导致会话状态没有正确同步到存储介质中。
而且你提到「直接dd()就正常」,这是因为dd会立即终止请求,框架的自动保存流程还没触发,此时手动调用的Session::save()反而生效了;但重定向时,框架后续的自动保存会覆盖或忽略你之前的手动操作,最终导致会话没存上。
分步解决方案
1. 移除手动的Session::save()调用
这是最关键的一步,修改后的代码如下:
class LoginController extends Controller { public function processLogin(LoginRequest $request) { $email = $request->get('email', ''); $password = $request->get('password', ''); $token = $this->_loginService->processLoginAttempt($email, $password); // 用框架的自动保存机制,不要手动调用Session::save() Session::put('access_token', $token); // 或者更简洁的辅助函数写法:session(['access_token' => $token]); return redirect()->route('portals'); } public function showPortals(Request $request) { dd(session('access_token')); // 也可以用辅助函数读取 } .... }
2. 排查会话驱动与存储权限
如果移除Session::save()后还是有问题,检查以下几点:
- 会话驱动配置:查看
.env文件里的SESSION_DRIVER,如果是file,确认storage/framework/sessions目录的权限是否正确(Laravel进程需要读写权限,一般设置为755或775);如果是database,确认会话表(默认是sessions)已经正确创建,且有写入权限。 - 会话ID传递:检查浏览器的Cookie是否正常存储了
laravel_session(或者你自定义的会话Cookie名),如果Cookie被禁用或丢失,刷新后会生成新的会话,自然读不到之前的token。
3. 确认路由的中间件配置
虽然你说请求的中间件组是web,但还是要确认portals路由是否确实在web中间件组下(一般routes/web.php里的路由默认都包含web中间件),避免因为中间件缺失导致会话无法读取。
4. 排查自定义中间件干扰
检查项目中有没有自定义的中间件,尤其是在响应发送前执行的逻辑,有没有意外清空或修改会话数据的操作。
验证方法
修改代码后,先执行登录重定向,然后去会话存储里验证:
- 如果是
file驱动,打开storage/framework/sessions下对应的会话文件,搜索access_token,看是否存在该键值对; - 如果是
database驱动,直接查询sessions表的payload字段(是序列化后的内容,能找到token即可)。
内容的提问来源于stack exchange,提问作者Tanaka
相关产品推荐
相关产品推荐

