AngularJS 和 Laravel - 跨域 CORS / XHR 请求缺少(记住)cookie
Posted
技术标签:
【中文标题】AngularJS 和 Laravel - 跨域 CORS / XHR 请求缺少(记住)cookie【英文标题】:AngularJS and Laravel - crossdomain CORS / XHR requests lacking (remember_) cookies 【发布时间】:2013-06-02 08:42:25 【问题描述】:当我不使用 chrome 中的 --disable-web-security 选项时,我的 CORS / XHR 请求在请求标头中缺少 remember_xyz cookie。如果我启用该选项,remember_xyz cookie 将包含在请求标头中,并且一切正常。
作为解决方法,我目前正在通过基本身份验证标头发送身份验证凭据。但我认为这不是预期或正确的方式。
我怎样才能获得包含在请求标头中的记忆 cookie?
编辑: 在 chrome 的网络控制台中,我可以看到以下内容:
(没有——chrome中的disable-web-security选项)
记住 cookie 由 laravel 在第一个响应头中发送。但不包含在下一个请求的标头中。为什么?
在实际请求触发之前,每个请求都有该 OPTIONS 预检请求。预检请求是否有可能以某种方式删除/破坏 cookie?
(with --disable-web-security chrome 选项)
remember cookie 由 laravel 在第一个响应头中发送,并将在下一个请求的头中通过 angular 发送。一切顺利。 编辑 2: 我是否可以将响应标头中的上述 cookie 包含到请求标头中?如果是,为什么我不必在 chrome 中启用“--disable-web-security”选项来执行此操作?
我做错了什么?
谢谢!
【问题讨论】:
【参考方案1】:不确定我是否直接回答了你的问题,但我会试一试。您确实需要在客户端和服务器上为 CORS 设置某些标头。
客户端需要知道发送 Cookie 标头,否则会将其剥离。对于 jQuery,这意味着在您的 ajax 调用中设置 withCredentials
参数。查看更多信息here。这听起来像是您正在努力解决的问题。
在服务器端,您可能需要确保设置了pre-flight 请求。
例如,当我在 Laravel 4 中使用 CORS 时,我有一个过滤器来为每个响应添加一些标头:
App::after(function($request, $response)
// Note that you cannot use wildcard domains when doing CORS with Authorization!
$response->headers->set('Access-Control-Allow-Origin', 'http://dev.domain.local');
$response->headers->set('Access-Control-Allow-Credentials', 'true');
$response->headers->set('Access-Control-Allow-Headers', 'Authorization, X-Requested-With');
);
在控制器中,我还有一个 OPTIONS 请求响应飞行前请求。一个例子是:
public function optionsComplex()
$response = Response::make(null, 200);
$response->headers->set('Allow', 'GET, PUT, DELETE');
$response->headers->set('Access-Control-Allow-Methods', 'GET, PUT, DELETE');
return $response;
希望对您有所帮助。
【讨论】:
谢谢!毕竟我是这样做的。最近我发现了 barryvdh/laravel-cors,看起来效果很好。以上是关于AngularJS 和 Laravel - 跨域 CORS / XHR 请求缺少(记住)cookie的主要内容,如果未能解决你的问题,请参考以下文章