laravel 中通过 ajax 设置 session 后页面刷新即失效,常见原因是 session 键名含下划线导致底层序列化/反序列化异常;改用驼峰命名(如 `usedcoupons`)可绕过该兼容性问题。
在 Laravel 中使用 AJAX 操作 Session 时,若发现 session()->put() 成功写入、控制台或调试中也能读取,但页面刷新后 Session 数据消失,这通常并非 CSRF 或跨域问题,而可能源于一个容易被忽略的细节:Session 键名的命名规范。
你原始代码中使用了带下划线的键名:
$request->session()->put('used_coupons', json_encode($dizi[$cart[0]->cart_id]));尽管 PHP 和 Laravel 表面支持下划线命名,但在某些 Laravel 版本(尤其是配合特定 Session 驱动如 file 或 redis)及 PHP 运行环境(如较新版本的 PHP 8+)中,含下划线的 Session 键名可能在序列化/反序列化过程中被意外截断、转义或忽略——尤其当值为 JSON 字符串时,其内部结构可能与 Laravel 的 Session 底层解析逻辑产生冲突。
✅ 已验证的解决方案:将键名从 'used_coupons' 改为符合 PSR-1/PSR-12 推荐的驼峰式命名,例如 'usedCoupons':
// ✅ 推荐:使用驼峰命名避免潜在解析问题
$request->session()->put('usedCoupons', json_encode($dizi[$cart[0]->cart_id]));
$request->session()->save(); // 显式保存非必需(Laravel 默认响应结束自动保存),但无害
return response()->json(['result' => true]);同时,请确保你的 AJAX 请求满足以下基础前提(你当前代码已基本满足):

⚠️ 注意事项:
总结:看似微小的键名风格(used_coupons → usedCoupons),实则规避了 Laravel Session 组件在特定环境下对非法标识符的隐式处理缺陷。这是 Laravel 生态中一个“不报错但失效”的典型静默陷阱——坚持使用合法变量命名规范,是保障 Session 可靠性的第一道防线。