当我在chrome中不使用--disable-web-security选项时,我的CORS / XHR请求在请求标头中缺少remember_xyz cookie。如果我启用该选项,remember_xyz cookie将包含在请求标头中,一切正常。
作为解决方法我正在通过基本身份验证标头发送身份验证凭据。但我认为这不是预期或正确的方式。
如何记住请求标头中包含的cookie?
修改:
在chrome的网络控制台中,我可以看到以下内容:
(没有 - chrome中的--disable-web-security选项)
记忆cookie由laravel在第一个响应头中发送。但是不会通过angular包含在下一个请求的标题中。为什么呢?
每个请求在实际请求触发之前都有OPTIONS预检请求。预检请求是否有可能以某种方式删除/破坏cookie?
( - chrome中的--disable-web-security选项)
记忆cookie由laravel在第一个响应标头中发送,并将通过angular在下一个请求的标头中发送。一切都好。
编辑2:
是否由我将响应标头中的cookie包含在请求标头中?如果是,为什么我不必在chrome中启用“--disable-web-security”选项来执行此操作?
我做错了什么?
谢谢!
答案 0 :(得分: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;
}
希望有所帮助。