Javascript AngularJS不使用Chrome的飞行前选项请求?

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

我使用AngularJS开发了一个简单的应用程序。我正在使用我自己在Laravel中开发的API。当我尝试使用Firefox登录应用程序时,它工作正常。我的API接受飞行前选项请求,并以200 OK响应。最后,POST请求生成一个令牌,用户登录

另一方面,当Chrome发送飞行前选项请求时,它会收到一个403返回,并在控制台中显示此错误:

XMLHttpRequest cannot load http://angulairapi.rohanchhabra.in/auth. Invalid HTTP status code 403
我也尝试过通过Postman REST客户端在/auth上发送选项请求,它会像预期的那样返回200 OK。为什么Chrome会这样?我缺少什么?

“访问控制请求头:接受”中的问题。 您需要将“accept”添加到“Access Control Allow Headers”中

比较这两个请求:

  • 铬:403禁止 curl'-X OPTIONS-H'访问控制请求方法:POST'/angulair.rohanchabra.in'-H'接受编码:gzip,deflate,sdch'-H'接受语言:ru-ru,ru;q=0.8,在美国;q=0.6,en;q=0.4'-H'用户代理:Mozilla/5.0(Macintosh;英特尔Mac OS X 10_10_1)AppleWebKit/537.36(KHTML,如Gecko)Chrome/39.0.2171.95 Safari/537.36'-H'接受:/'-H'引用者:'-H'连接:保持活动状态'-H'访问控制请求头:接受,内容类型'-v

  • Firefox:200 OK curl'-X OPTIONS-H'访问控制请求方法:POST'-H'来源:'-H'接受编码:gzip,deflate,sdch'-H'接受语言:ru-ru,ru;q=0.8,在美国;q=0.6,en;q=0.4'-H'用户代理:Mozilla/5.0(Macintosh;英特尔Mac OS X 10_10_1)AppleWebKit/537.36(KHTML,如Gecko)Chrome/39.0.2171.95 Safari/537.36'-H'接受:/'-H'引用者:'-H'连接:保持活动状态'-H'访问控制请求头:内容类型'-v


  • 在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'];
        }
    ]);