2012-09-22 14 views
16

Tôi muốn phân phát các tập lệnh JavaScript của mình từ CDN như cloudflare.Chính sách cùng nguồn gốc và phân phát JS từ CDN

Bây giờ tập lệnh của tôi giao tiếp với máy chủ ứng dụng của tôi qua ajax. Các hạn chế chính sách có nguồn gốc giống nhau sẽ không hoạt động khi tôi tải các tập lệnh này từ CDN?

Hãy nói rằng ứng dụng của tôi là trên lĩnh vực:

http://app.com 

Và tôi tải tập lệnh của tôi từ

http://cdn.com/xyz/all.js 

Bây giờ, kể từ khi kịch bản của tôi được nạp từ một tên miền khác với miền ứng dụng của tôi là chạy từ, tôi đoán chính sách gốc tương tự sẽ ngăn cản tôi thực hiện giao tiếp ajax với ứng dụng của mình.

Tôi có gặp vấn đề gì không?

Trả lời

19

Không, nó sẽ hoạt động. Đó là lý do tại sao JSONP hoạt động. "Nguồn gốc" của tập lệnh là trang được thực thi, không phải là từ đâu.

Như bạn hỏi cho nó, đây là một tài liệu tham khảo (tôi không thể tìm thấy bất kỳ tốt hơn, nhưng Crockford nổi tiếng)

Thuộc tính src, đáng ngạc nhiên, không bị hạn chế bởi chính sách xứ Same. Điều này có nghĩa là một phần tử kịch bản có thể được tạo ra có thể đến bất kỳ máy chủ nào, tìm nạp một kịch bản lệnh và thực hiện nó. Nếu kịch bản gây ra việc phân phối dữ liệu được mã hóa JSON, thì đây là một điều rất hữu ích. Thật không may, không có cách nào để hạn chế kịch bản hoặc kiểm tra nó trước khi nó thực thi. Nó chạy với cùng quyền hạn như các tập lệnh từ trang. Vì vậy, tập lệnh có thể truy cập và sử dụng cookie của tập lệnh. Nó có thể truy cập vào máy chủ gốc bằng cách sử dụng ủy quyền của người dùng. Nó có thể kiểm tra DOM và đối tượng toàn cầu JavaScript và gửi bất kỳ thông tin nào mà nó tìm thấy ở bất kỳ đâu trên thế giới. Script Tag Hack không an toàn và cần tránh.

http://javascript.crockford.com/script.html

Không thực sự là một tài liệu tham khảo: Nếu điều này sẽ không làm việc, không ai có thể bao gồm jQuery từ CDN của Google và sau đó sử dụng nó $.ajax phương pháp.

+0

Lý do JSONP hoạt động là vì bạn có thể ** GET ** tập lệnh từ mọi nơi. Nhưng những gì tôi cần làm là ** POST ** đến một máy chủ có tên miền khác với nguồn gốc của tập lệnh. Vui lòng làm rõ câu trả lời của bạn thêm một chút – treecoder

+0

Bây giờ bạn đang trộn hai thứ. Tập lệnh của bạn được tải xuống bằng cách sử dụng * GET * từ CDN. Sau đó, nó tồn tại trong miền của app.com – Prinzhorn

+0

Tôi không biết tôi không nhận được gì ở đây, nhưng một tập lệnh được tải từ miền A KHÔNG thể gửi dữ liệu đến miền B phải không? Nếu tôi đúng, làm thế nào có thể một tập lệnh được tải từ CDN nói chuyện với một miền hoàn toàn khác của máy chủ ứng dụng? – treecoder