对预检请求的响应不会通过访问控制检查

我收到此错误使用ngResource调用亚马逊网络服务上的REST API:

XMLHttpRequest无法加载http://server.apiurl.com:8000/s/login?login=facebook。 对预检请求的响应不会通过访问控制检查:请求的资源上不存在“访问控制 - 允许来源”标头。 因此不允许Origin'http:// localhost'访问。 错误405

服务:

socialMarkt.factory('loginService', ['$resource', function($resource){    
    var apiAddress = "http://server.apiurl.com:8000/s/login/";
    return $resource(apiAddress, { login:"facebook", access_token: "@access_token" ,facebook_id: "@facebook_id" }, {
                getUser: {method:'POST'}
            });
}]);

控制器:

[...]
loginService.getUser(JSON.stringify(fbObj)),
                function(data){
                    console.log(data);
                },
                function(result) {
                    console.error('Error', result.status);
                }
[...]

我使用chrome,我不知道还有什么可以解决这个问题。 我甚至将服务器配置为接受来自origin localhost头文件


您遇到了CORS问题。

有几种方法可以解决这个问题。

  • 关闭CORS。 例如:如何在铬中关闭cors
  • 为您的浏览器使用插件
  • 使用诸如nginx之类的代理。 如何设置的例子
  • 更详细地说,您正尝试从本地主机访问api.serverurl.com。 这是跨域请求的确切定义。

    通过关闭它只是为了完成您的工作(好吧,如果您访问其他网站并将可用的路由器踢出去,那么可能会导致安全性降低),您可以使用代理,让浏览器认为所有请求都来自本地主机真的,你有本地服务器,然后调用远程服务器。

    所以api.serverurl.com可能会成为localhost:8000 / api,并且您的本地nginx或其他代理将发送到正确的目标。


    我的“API服务器”是一个PHP应用程序,所以要解决这个问题,我找到了下面的解决方案:

    将行放在index.php中

    header('Access-Control-Allow-Origin: *');
    header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
    header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');
    

    在AspNetCore web api中,通过添加“Microsoft.AspNetCore.Cors”(版本1.1.1)并在Startup.cs中添加以下更改,可以解决此问题。

    public void ConfigureServices(IServiceCollection services)
    { 
        services.AddCors(options =>
        {
              options.AddPolicy("AllowAllHeaders",
                    builder =>
                {
                        builder.AllowAnyOrigin()
                               .AllowAnyHeader()
                               .AllowAnyMethod();
                    });
        });
        .
        .
        .
    }
    

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
    
    
        // Shows UseCors with named policy.
        app.UseCors("AllowAllHeaders");
        .
        .
        .
    }
    

    并在控制器上放置[EnableCors("AllowAllHeaders")]

    链接地址: http://www.djcxy.com/p/42451.html

    上一篇: Response to preflight request doesn't pass access control check

    下一篇: How do I accept CORS AJAX requests on AppHarbor?