Laravel 5.5变量无法存入Session问题技术求助
解决Laravel 5.5中AJAX请求无法存入Session的问题
我来帮你排查这个Session存不上的问题,咱们一步步拆解问题并修复:
核心问题分析
从你的代码来看,主要有两个关键问题导致Session无法正常存储:
- JSON数据解析错误:你用
parse_str()处理请求内容,但parse_str()是用来解析URL编码的字符串(如a=1&b=2),而你的AJAX请求设置了contentType: "json",请求体是JSON格式,用这个方法解析完全不对。 - CSRF令牌缺失:Laravel的POST请求需要验证CSRF令牌,如果AJAX请求没携带令牌,请求会被框架拦截,Session初始化也会受影响。
具体修复步骤
1. 修复请求数据解析逻辑
把控制器里的解析代码替换成Laravel原生的JSON解析方法,直接用请求对象就能获取解析后的数组:
function booking(Request $request) { // 直接获取JSON格式的请求数据,Laravel会自动解析 $info = $request->all(); // 或者明确指定解析JSON:$info = $request->json()->all(); Session::put('quotation.flight.passengerDetails', $info); return Session::get('quotation.flight.searchType'); }
2. 给AJAX请求添加CSRF令牌验证
首先在页面的<head>里添加CSRF令牌的meta标签:
<meta name="csrf-token" content="{{ csrf_token() }}">
然后修改AJAX请求,在headers里携带CSRF令牌,同时确保数据是正确的JSON字符串:
$.ajax({ url: flagsUrl + "ajax/flight/booking", type: 'POST', data: JSON.stringify(opts.bookingData), // 把JS对象转为JSON字符串 contentType: "application/json", headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }, success: function(response) { // 你的成功处理逻辑 } });
3. 验证路由中间件配置
确保你的路由处于web中间件组中(因为web中间件包含Session初始化和CSRF验证的逻辑,而api中间件默认不支持Session)。
检查web.php里的路由,默认已经自动应用web中间件组,你可以通过执行以下命令确认:
php artisan route:list
查看目标路由的中间件列,确认包含web。
4. 调试验证Session存储
可以在控制器里临时添加调试代码,确认数据是否真的存入Session:
function booking(Request $request) { $info = $request->all(); Session::put('quotation.flight.passengerDetails', $info); // 打印Session内容,确认是否存入 dd(Session::get('quotation.flight.passengerDetails')); return Session::get('quotation.flight.searchType'); }
如果能打印出正确的$info数据,说明Session存储正常,后续再移除调试代码即可。
额外注意事项
- 确保
storage/framework/sessions目录有读写权限(如果用file驱动的Session); - 确认你的Session配置(
config/session.php)没有异常,比如驱动设置正确。
内容的提问来源于stack exchange,提问作者Arosha De Silva
相关产品推荐
相关产品推荐

