Từ những gì tôi đã đọc về CORS, tôi hiểu nó sẽ làm việc như sau:CORS: Tại sao trình duyệt của tôi không gửi yêu cầu preflight preflight?
- Script trên một mặt khách hàng cố gắng lấy resource từ một máy chủ với nguồn gốc khác nhau.
- Trình duyệt chặn yêu cầu này và trước tiên thực hiện yêu cầu preflight OPTIONS cho cùng một URL.
- Nếu phản ứng yêu cầu preflight này chứa tiêu đề thích hợp (ví dụ
Access-Control-Allow-Origin: *
), trình duyệt hiểu nó được phép gửi yêu cầu chính và hiện nó. - Trả lời được trả lại cho tập lệnh khách hàng.
tôi đã thiết lập một thử nghiệm cho nó như thế này:
- máy chủ tại Gò chấp nhận cả hai - GET và OPTIONS yêu cầu (kiểm tra sử dụng CURL) - và thiết lập
Access-Control-*
tiêu đề trong phản ứng trang HTML đơn giản (được phục vụ bởi một máy chủ khác trên cổng khác) với tập lệnh sau trong đó (
$
là viết tắt của jQuery):$.ajax({ type: "GET", crossDomain: true, url: "http://local.site.com/endpoint, success: function (data) { alert(data); }, error: function (request, error) { alert(error); } });
Khi tôi gọi phương pháp này, tuy nhiên, tôi thấy chỉ có một GET và không OPTIONS preflight yêu cầu trong tab Mạng trong cả hai - Chrome 49 và Firefox 33.
Dưới đây là chi tiết về yêu cầu GET của tôi từ Chrome:
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,ru;q=0.6
Connection:keep-alive
Host:local.adform.com
Origin:http://localhost:7500
Referer:http://localhost:7500/test-page.html
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36
và phản ứng tương ứng:
Access-Control-Allow-Headers:Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization
Access-Control-Allow-Methods:POST, GET, OPTIONS, PUT, DELETE
Access-Control-Allow-Origin:*
Content-Length:2
Content-Type:text/plain; charset=utf-8
Date:Wed, 03 Aug 2016 10:53:19 GMT
Bất kỳ suy nghĩ về lý do tại sao (s) trình duyệt của tôi không gửi preflight yêu cầu?
preflight không phải lúc nào cũng được thực hiện, ít có khả năng (nếu có?) Với GET - xem [tài liệu] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests) cho khi preflight được yêu cầu –
Xem [this] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests) để biết thêm thông tin về thời điểm trình duyệt phát hành yêu cầu preflight. – robertklep
@JaromandaX: Cảm ơn bạn đã nhận xét. Nếu yêu cầu preflight không phải lúc nào cũng được yêu cầu, cách (thông thường) để vượt qua chính sách "cùng nguồn gốc" là gì? Kịch bản là: chúng tôi tạo tập lệnh sẽ được tích hợp vào các trang web của bên thứ ba và sẽ gửi cho chúng tôi cookie _our_? Theo tôi hiểu, không có trình duyệt yêu cầu preflight sẽ không gửi cookie đến máy chủ của chúng tôi, đúng không? – ffriend