2013-07-26 45 views
29

Như bạn đã biết, bảo mật của trình duyệt web không cho phép thực hiện các yêu cầu miền chéo. Tôi đọc một cuốn sách mà nói rằng bạn nên sử dụng XMLHTTPRequest chỉ khi bạn có thể đặt các tập tin trên máy chủ (có nghĩa là đặt trang bạn sẽ tải vào cùng một tên miền yêu cầu). Nếu bạn không thể - bạn nên tìm kiếm một giải pháp thay thế.Cách thực hiện yêu cầu tên miền chéo

Câu hỏi của tôi là:

  1. thay thế tên miền chéo XMLHttpRequest là gì?
  2. Điều gì về WebSockets? Công nghệ này có cho phép yêu cầu miền chéo không?

EDIT: Nó vẫn còn chưa rõ ràng với tôi ...

Ví dụ, tôi kéo trang của tôi từ www.domain1.com và tôi cần phải yêu cầu javascript từ www .domain2.com. Vì vậy, trang được kéo nên bao gồm một cái gì đó như:

<script src="www.domain2.com/script.js"></script> 

để tránh giới hạn miền chéo.

Và tôi có thể sử dụng JSONP, và yêu cầu sẽ trông giống như: http://ww.domain1.com/?callback=someFunction.js

Nhưng: không phải là nó giống nhau không? Tôi chỉ cần kéo js từ một tên miền khác! Nó có tránh hạn chế miền chéo không?

+0

[Bài viết này về MDN giải thích vấn đề và giải pháp khá tốt] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS) – Liam

Trả lời

4

Làm một cross-domain cuộc gọi AJAX

bạn web-dịch vụ phải hỗ trợ tiêm phương pháp để làm JSONP.

Mã của bạn có vẻ tốt và nó sẽ hoạt động nếu các dịch vụ web và ứng dụng web của bạn được lưu trữ trong cùng một miền.

Khi bạn thực hiện $ .ajax với dataType: 'jsonp' có nghĩa là jQuery thực sự đang thêm thông số mới vào URL truy vấn.

Ví dụ: nếu URL của bạn là http://10.211.2.219:8080/SampleWebService/sample.do thì jQuery sẽ thêm? Callback = {some_random_dynamically_generated_method}.

Phương pháp này là loại proxy thực sự gắn trong đối tượng cửa sổ. Đây là không có gì cụ thể nhưng không giống như thế này:

window.some_random_dynamically_generated_method = function(actualJsonpData) { 
    //here actually has reference to the success function mentioned with $.ajax 
    //so it just calls the success method like this: 
    successCallback(actualJsonData); 
} 

Kiểm tra sau để biết thêm thông tin

http://json-p.org/

Make cross-domain ajax JSONP request with jQuery

+0

vâng, cảm ơn. Nhưng bạn có thể cung cấp câu trả lời cho khu vực EDIT câu hỏi id, xin vui lòng –

18

Bạn có thể đưa ra yêu cầu tên miền chéo bằng đối tượng XMLHttpRequest. Điều này được thực hiện bằng cách sử dụng một cái gì đó gọi là "Cross nguồn gốc chia sẻ".Xem: http://en.wikipedia.org/wiki/Cross-origin_resource_sharing

Rất đơn giản, khi yêu cầu được gửi đến máy chủ, máy chủ có thể phản hồi với tiêu đề Access-Control-Allow-Origin cho phép hoặc từ chối yêu cầu. Trình duyệt cần kiểm tra tiêu đề này và nếu nó được cho phép thì nó sẽ tiếp tục với quá trình yêu cầu. Nếu không trình duyệt sẽ hủy yêu cầu.

Bạn có thể tìm thấy một số thông tin và một ví dụ làm việc ở đây: http://www.leggetter.co.uk/2010/03/12/making-cross-domain-javascript-requests-using-xmlhttprequest-or-xdomainrequest.html

JSONP là một giải pháp thay thế, nhưng bạn có thể tranh luận đó là một chút của một hack.

+0

Tôi sẽ cho rằng đây cũng là một chút của một hack. Tuy nhiên, không giữ tôi sử dụng nó! : D –

3

Nếu bạn sẵn sàng truyền một số dữ liệu và không cần bảo mật (bất kỳ thông tin công khai nào), bạn có thể sử dụng proxy CORS, rất dễ dàng, bạn sẽ không phải thay đổi bất kỳ thứ gì trong mã của mình hoặc ở phía máy chủ (đặc biệt là không phải máy chủ của bạn như Yahoo API hoặc OpenWeather). Tôi đã sử dụng nó để tìm nạp các tệp JSON với XMLHttpRequest và nó hoạt động tốt.