Theo chia sẻ tài nguyên nguồn gốc chéo - CORS
(Yêu cầu AJAX tên miền chéo AKA) là vấn đề mà hầu hết các nhà phát triển web có thể gặp phải, theo Same-Origin-Policy, các trình duyệt hạn chế JavaScript máy khách trong hộp cát bảo mật, thông thường, JS không thể giao tiếp trực tiếp với máy chủ từ xa từ một miền khác nhau. Trước đây, các nhà phát triển đã tạo ra nhiều cách khó khăn để đạt được yêu cầu tài nguyên Tên miền chéo, phổ biến nhất là sử dụng các cách là:
- Sử dụng Flash / Silverlight hoặc phía máy chủ làm "proxy" để liên lạc với điều khiển từ xa.
- JSON có đệm ( JSONP ).
- Nhúng máy chủ từ xa vào iframe và liên lạc qua đoạn hoặc window.name, tham khảo tại đây .
Những cách khó khăn đó có ít nhiều vấn đề, ví dụ JSONP có thể dẫn đến lỗ hổng bảo mật nếu các nhà phát triển chỉ đơn giản là "đánh bại" nó và # 3 ở trên, mặc dù nó hoạt động, cả hai miền nên xây dựng hợp đồng chặt chẽ với nhau, nó không linh hoạt hay thanh lịch IMHO :)
W3C đã giới thiệu Chia sẻ tài nguyên nguồn gốc chéo (CORS) như một giải pháp tiêu chuẩn để cung cấp một cách an toàn, linh hoạt và là một cách tiêu chuẩn được đề xuất để giải quyết vấn đề này.
Cơ chế
Từ cấp độ cao, chúng ta có thể coi CORS là một hợp đồng giữa cuộc gọi AJAX của khách hàng từ miền A và một trang được lưu trữ trên miền B, một yêu cầu / phản hồi Cross-Origin điển hình sẽ là:
Tiêu đề yêu cầu AJA của DomainA
Host DomainB.com
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,application/json
Accept-Language en-us;
Accept-Encoding gzip, deflate
Keep-Alive 115
Origin http://DomainA.com
Tiêu đề phản hồi của DomainB
Cache-Control private
Content-Type application/json; charset=utf-8
Access-Control-Allow-Origin DomainA.com
Content-Length 87
Proxy-Connection Keep-Alive
Connection Keep-Alive
Các phần màu xanh mà tôi đã đánh dấu ở trên là các sự kiện hạt nhân, "Tiêu đề yêu cầu gốc" cho biết yêu cầu xuất xứ chéo hoặc yêu cầu preflight bắt nguồn từ ", tiêu đề phản hồi" Access-Control-Allow-Origin "cho biết trang này cho phép yêu cầu từ xa DomainA (nếu giá trị là * cho phép yêu cầu từ xa từ bất kỳ miền nào).
Như tôi đã đề cập ở trên, W3 đã đề xuất trình duyệt thực hiện " yêu cầu preflight " trước khi gửi yêu cầu HTTP có nguồn gốc thực sự, tóm lại, đây là một OPTIONS
yêu cầu HTTP :
OPTIONS DomainB.com/foo.aspx HTTP/1.1
Nếu foo.aspx hỗ trợ động từ HTTP TÙY CHỌN, nó có thể trả về phản hồi như bên dưới:
HTTP/1.1 200 OK
Date: Wed, 01 Mar 2011 15:38:19 GMT
Access-Control-Allow-Origin: http://DomainA.com
Access-Control-Allow-Methods: POST, GET, OPTIONS, HEAD
Access-Control-Allow-Headers: X-Requested-With
Access-Control-Max-Age: 1728000
Connection: Keep-Alive
Content-Type: application/json
Chỉ khi phản hồi chứa "Kiểm soát truy cập-Cho phép-Xuất xứ" VÀ giá trị của nó là "*" hoặc chứa tên miền đã gửi yêu cầu CORS, bằng cách đáp ứng trình duyệt điều kiện bắt buộc này sẽ gửi yêu cầu Tên miền chéo thực tế và lưu trữ kết quả vào bộ đệm trong " Preflight-result-Cache ".
Tôi đã viết blog về CORS ba năm trước: Yêu cầu HTTP có nguồn gốc chéo AJAX
http://siteA/MyCode.js
.