Javascript 无法在Angular应用程序中跨域发布数据

Javascript 无法在Angular应用程序中跨域发布数据,javascript,ruby-on-rails,angularjs,Javascript,Ruby On Rails,Angularjs,编辑: 问题解决了。我的前端代码很好,这是后端人员的错误 我在发布数据跨域时遇到问题。我不知道为什么,就在3小时前,它还不错。当时我只是在CSS和HTML中做了一些更改,我没有接触任何JS文件。我还询问了后端团队(他们正在使用Ruby on Rails),他们告诉我他们仍在使用localhost。 当我同时使用Firefox和Chrome时,每次尝试发布到服务器时都会出现此错误: XMLHttpRequest cannot load https://time-traveler-back.hero

编辑: 问题解决了。我的前端代码很好,这是后端人员的错误

我在发布数据跨域时遇到问题。我不知道为什么,就在3小时前,它还不错。当时我只是在CSS和HTML中做了一些更改,我没有接触任何JS文件。我还询问了后端团队(他们正在使用Ruby on Rails),他们告诉我他们仍在使用localhost。
当我同时使用Firefox和Chrome时,每次尝试发布到服务器时都会出现此错误:

XMLHttpRequest cannot load https://time-traveler-back.herokuapp.com/api/sessions/login. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:9000' is therefore not allowed access. The response had HTTP status code 503. 
对于Chrome,我已经安装了CORS应用程序。但如果我打开它,会出现另一个错误:

XMLHttpRequest cannot load https://time-traveler-back.herokuapp.com/api/sessions/login. A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'http://localhost:9000' is therefore not allowed access.
这是我的应用程序配置:

// Config for POST data cross domain
app.config(['$routeProvider', '$httpProvider', function($routeProvider, $httpProvider) {
    $httpProvider.defaults.useXDomain = true;
    $httpProvider.defaults.withCredentials = true;
    delete $httpProvider.defaults.headers.common["X-Requested-With"];
    $httpProvider.defaults.headers.common["Accept"] = "application/json";
    $httpProvider.defaults.headers.common["Content-Type"] = "application/json";
}]);
以下是我发布数据的方式:

var apiUrl = 'https://time-traveler-back.herokuapp.com/api/';
$http({
    method: 'POST',
    url: apiUrl + 'sessions/login',
    data: $.param(formData), // pass in data as strings
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    } // set the headers so angular passing info as form data (not request payload)
})
.then(function successCallback(response) {
    // my stuffs
}, function errorCallback(response) {
    // my stuffs
});
请帮帮我。谢谢

证书和COR

使用withCredentials时需要注意一点:在应用程序中为true,并且 为CORS配置服务器是因为您可能没有 访问控制允许源标题设置为“*”。必须对其进行配置 选择几个来源。如果您必须将此设置为*, 然后我建议做一些超越基于cookie的身份验证的事情, 例如,基于令牌的身份验证


请参见

看起来像是标准的CORS错误

您已经修复了,但如果有疑问,我将给出一些建议:


如果使用rails作为后端,您一定要查看
rackCORS
gem。这基本上是通过中间件以最简单的方式为您的服务器设置所有CORS策略:

#config/application.rb
   ...
   config.middleware.insert_before 0, "Rack::Cors" do
      allow do
        origins '*'
        resource '*', headers: :any, methods: [:get, :post, :options]
      end
    end
这允许您允许应用程序使用特定域“源”和方法

--

您还必须记住,为了防止跨域XML请求,建立“CORS”(跨源资源共享)是为了对JS请求可访问的资源/URL应用“锁”

根据经验,如果您使用JS自动更新前端,并使用单独域的XML请求(不仅仅是Ajax),则需要在服务器的CORS策略中允许该域


有很多方法可以做到这一点;使用rails最简单的方法是使用
机架CORS
gem(如上所述)。

感谢您的回复,但是,我仍然不明白您的想法。您不明白哪一部分?您可以将服务器定义为返回允许的客户端列表,而不是
*
(全部),或者使用另一个身份验证过程。谢谢,但我编辑了我的问题。这是后端团队的错误。谢谢你的帮助。如果我以后犯了那个错误,我会回来的。