Javascript AngularJS不使用Chrome的飞行前选项请求?
我使用AngularJS开发了一个简单的应用程序。我正在使用我自己在Laravel中开发的API。当我尝试使用Firefox登录应用程序时,它工作正常。我的API接受飞行前选项请求,并以200 OK响应。最后,POST请求生成一个令牌,用户登录 另一方面,当Chrome发送飞行前选项请求时,它会收到一个403返回,并在控制台中显示此错误:Javascript AngularJS不使用Chrome的飞行前选项请求?,javascript,angularjs,google-chrome,laravel-4,Javascript,Angularjs,Google Chrome,Laravel 4,我使用AngularJS开发了一个简单的应用程序。我正在使用我自己在Laravel中开发的API。当我尝试使用Firefox登录应用程序时,它工作正常。我的API接受飞行前选项请求,并以200 OK响应。最后,POST请求生成一个令牌,用户登录 另一方面,当Chrome发送飞行前选项请求时,它会收到一个403返回,并在控制台中显示此错误: XMLHttpRequest cannot load http://angulairapi.rohanchhabra.in/auth. Invalid HTT
XMLHttpRequest cannot load http://angulairapi.rohanchhabra.in/auth. Invalid HTTP status code 403
我也尝试过通过Postman REST客户端在/auth上发送选项请求,它会像预期的那样返回200 OK。为什么Chrome会这样?我缺少什么?“访问控制请求头:接受”中的问题。
您需要将“accept”添加到“Access Control Allow Headers”中
比较这两个请求:
在Laravel中,尝试将:
'Access-Control-Allow-Methods'
&'Access-Control-Allow-Headers'
设置为'*'
public function handle($request, Closure $next)
{
header("Access-Control-Allow-Origin: *");
// ALLOW OPTIONS METHOD
$headers = [
'Access-Control-Allow-Methods'=> '*',
'Access-Control-Allow-Headers'=> '*'
];
if($request->getMethod() == "OPTIONS") {
// The client-side application can set only headers allowed in Access-Control-Allow-Headers
return Response::make('OK', 200, $headers);
}
$response = $next($request);
foreach($headers as $key => $value)
$response->header($key, $value);
return $response;
}
在filters.php(Laravel 4.2)
加在下面
App::before(function($request)
{
// Enable CORS
// In production, replace * with http://yourdomain.com
header("Access-Control-Allow-Origin: *");
//header('Access-Control-Allow-Credentials: true'); optional
if (Request::getMethod() == "OPTIONS") {
// The client-side application can set only headers allowed in Access-Control-Allow-Headers
$headers = [
'Access-Control-Allow-Methods'=> '*',
'Access-Control-Allow-Headers'=> '*'
];
return Response::make('You are connected to the API', 200, $headers);
}
});
您可以更改
访问控制-*
的值以满足您的需要首先,您必须发送这些标题(通配符有时不正确):
在第二个(也是重要的一个)中,从配置中的AngularJs服务$httpProvider中删除头:
myApp.config(['$httpProvider', function($httpProvider) {
$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
}
]);
访问控制是服务器的责任,您需要在Laravel中对此进行配置
使用此软件包:这非常有帮助。我添加了“接受”标题和“接受”标题。还是不行?如果愿意,可以查看API的存储库。它是公共的。缺少
访问控制允许标头
和访问控制允许方法
,您能否在响应中将它们也作为*发送?我不明白。我应该把这个函数确切地放在哪里?抱歉,有点晚了,但是当我尝试像boomerang这样的Soap客户端时,我尝试访问的跨域服务器工作得很好,但是当我尝试从localhost时,它不工作。为什么呢?
myApp.config(['$httpProvider', function($httpProvider) {
$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
}
]);