CORS - 通过允许服务器上的 Origin 实现没有 JSONP 的跨域 AJAX

IT技术 javascript ruby-on-rails ajax ember.js cross-domain
2021-02-20 07:26:21

我在同一台服务器上有两个独立的应用程序,其中一个 EmberJS 试图对我的后端 API 进行跨域调用。

我设置了后端 API 以允许来自该特定来源的跨域请求。但是,有没有办法避免在这样的设置中使用 JSONP?$.ajax在发送之前阻止跨域请求。如果不是,CORS 的意义是什么,我实现了哪个服务器端来接受来自我的 JS 前端源的请求?

编辑

AJAX 请求:

$.ajax({
    url: "api.lvh.me:3000/accounts/login",
    data: cred,
    type: "POST",
    xhrFields: {
        withCredentials: true
    },
    success: function(response){
        alert('succeeded!');
        console.log(response);
        alert(response);
    },
    failure: function(message){
        alert("failed");
        console.log(message);
        alert(message);
    }
});
3个回答

如果启用 CORS,则无需使用 JSONP。

Access-Control-Allow-Origin: http://www.example.com

如果在响应中设置了这个标头,那么普通的 XmlHttpRequest 将能够访问响应,就好像它就像同一个域一样。检查此标题是否设置正确。

如果您使用的是 jquery,我希望此链接对您有所帮助。 CORS POST 请求通过普通的 javascript 工作,但为什么不使用 jQuery?

更新:示例

var xmlhttp= new XMLHttpRequest();
var url="https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control";
xmlhttp.open("GET",url,false);
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
xmlhttp.send();

在任何域中尝试此操作,您都会得到响应。

更新解决方案:

没有“http://”的请求 url 导致了问题,在前面加上“http://”解决了这个问题

我们如何启用 CORS?
2021-05-02 07:26:21
我确实添加Access-Control-Allow-Origin: *了标头响应,但仍然出现相同的错误。我正在使用 jQuery 1.9,因此 jQuery 与 JS 的问题不应该成为问题。请参阅我对我发送的 jQuery AJAX 请求的编辑。
2021-05-18 07:26:21

您可以rack-corsRails 5 中使用,将其设置为允许所有 URL。

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins '*'
    resource '*', headers: :any, methods: [
      :get, :post, :put, :patch, :delete, :options, :head
    ]
  end
end

在跨域环境中,我建议使用 JSONP 代替 CORS,因为许多免费主机不支持跨域 CORS。它在工作示例中有详细说明- JSONP 和 CORS。