2013-06-26 35 views
8

Tôi có hai ứng dụng riêng biệt trên cùng một máy chủ, với ứng dụng EmberJS đang cố gắng thực hiện cuộc gọi tên miền chéo tới API phụ trợ của tôi.CORS - AJAX Cross-Domain Nếu không có JSONP bằng cách cho phép xuất xứ trên máy chủ

Tôi thiết lập API phụ trợ của mình để cho phép yêu cầu miền chéo từ nguồn gốc cụ thể đó. Có cách nào tuy nhiên, để tránh sử dụng JSONP với một thiết lập như vậy? $.ajax đang chặn các yêu cầu miền chéo trước khi chúng được gửi. Nếu không, điểm CORS là gì, phía máy chủ nào mà tôi đã triển khai để chấp nhận các yêu cầu từ nguồn front-end JS của tôi? yêu cầu

EDIT

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); 
    } 
}); 
+0

Tại sao bạn không chỉ đơn giản là đảo ngược proxy phụ trợ để vấn đề CORS không bao giờ xảy ra? Chỉnh sửa: Tôi không nghĩ rằng $ .ajax chặn các yêu cầu đó, vì nó phải yêu cầu máy chủ cho dù chúng được cho phép hay không ... – Coxer

+0

Proxy ngược lại có cho phép tất cả các yêu cầu gốc không? – darksky

+1

Bạn đã thử thêm 'http: //' vào thuộc tính url trong cuộc gọi $ .ajax chưa? – Ike

Trả lời

9

Không có nhu cầu sử dụng JSONP nếu bạn kích hoạt CORS.

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

nếu tiêu đề này được đặt trong thư trả lời, thì XmlHttpRequest bình thường sẽ có thể truy cập phản hồi giống như tên miền đó. Kiểm tra xem tiêu đề này có được đặt chính xác hay không.

Tôi hy vọng rằng liên kết này sẽ giúp bạn nếu bạn đang sử dụng jquery A CORS POST request works from plain javascript, but why not with jQuery?

Cập nhật: Ví dụ

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(); 

Hãy thử điều này trong bất kỳ tên miền, bạn sẽ nhận được câu trả lời.

Cập nhật giải pháp:

Yêu cầu url không có "http: //" gây ra vấn đề, thêm vào trước "http: //" giải quyết vấn đề này

+0

Tôi đã thêm 'Access-Control-Allow-Origin: *' trong phản hồi tiêu đề nhưng tôi vẫn tiếp tục gặp lỗi tương tự. Tôi đang sử dụng jQuery 1.9 để vấn đề với jQuery vs JS không phải là một vấn đề. Vui lòng xem chỉnh sửa của tôi cho yêu cầu jQuery AJAX mà tôi đang gửi. – darksky

+0

bạn đang gặp phải lỗi gì? –

+0

Điều này có nghĩa là: ** Chúng tôi có cần thay đổi trong phản hồi dịch vụ web không? ** –

0

Bạn có thể sử dụng rack-cors trong Rails 5, để thiết lập nó cho phép tất cả các 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 
0

Trong môi trường tên miền chéo, tôi khuyên bạn nên sử dụng JSONP thay vì CORS vì nhiều máy chủ miễn phí không hỗ trợ CORS đa miền. Chi tiết được mô tả chi tiết trong working examples - cả JSONP và CORS.