Laravel 4.2中AJAX设置Cookie后刷新无法获取$_COOKIE['token']问题
咱们先拆解下问题根源:
- 原生
setcookie()设置的Cookie,在当前请求周期内没法通过$_COOKIE获取——因为$_COOKIE是请求启动时就被PHP填充的,当前请求刚设置的Cookie,要等下一次请求才会被浏览器携带回来。 - 你自己写的
getcookie()方法是从响应头的Set-Cookie里取值,这只能拿到当前请求刚生成的Cookie值,并不是浏览器实际存储的内容,页面刷新后新请求的响应头里没有这个值,自然就取不到了。
接下来给你几个针对性的解决方案:
1. 用Laravel原生方法设置Cookie
Laravel有自己的Cookie管理逻辑,用框架提供的方式设置,能避免和原生函数的冲突:
// 在AJAX对应的控制器方法中,生成token并返回响应 $token = // 这里放你生成token的逻辑 // 返回JSON响应的同时设置Cookie,第三个参数是有效期(分钟),示例设为30天 return response()->json(['status' => 'success']) ->cookie('token', $token, 60*24*30);
2. 正确获取Cookie值
别再用$_COOKIE或者自定义的getcookie方法了,用Laravel的Request对象来获取,既安全又符合框架规范:
// 方式1:使用Request门面 use Illuminate\Support\Facades\Request; $token = Request::cookie('token'); // 方式2:在控制器方法中注入Request实例 public function addToCart(Request $request) { $token = $request->cookie('token'); if ($token) { $cart = Cart::create([ 'user' => $token ]); } }
3. 跨域AJAX的额外配置(如果涉及跨域)
如果你的AJAX请求是跨域的,还需要补充两步:
- 前端开启
withCredentials:$.ajax({ url: '/your-add-cart-url', method: 'POST', xhrFields: { withCredentials: true }, // 其他请求参数... }); - 后端设置跨域响应头:
return response()->json(['status' => 'success']) ->header('Access-Control-Allow-Credentials', 'true') ->cookie('token', $token, 60*24*30);
按照上面的方法调整后,页面刷新时就能正常读取到Cookie里的token值,不会再出现Undefined Index的错误啦。
内容的提问来源于stack exchange,提问作者Geethu
相关产品推荐
相关产品推荐

