2012-12-21 18 views
20

Tôi đang cố gửi yêu cầu CORS cho tải trọng JSON. Tôi kiểm soát cả máy chủ và máy khách.Làm thế nào để bạn gửi tiêu đề tùy chỉnh trong một tên miền chéo (CORS) XMLHttpRequest?

tôi sau cùng ở đây: https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control

Các máy chủ có một tiêu đề tùy chỉnh mà phải được gửi cùng với mọi yêu cầu. Do đó, tiêu đề tùy chỉnh này làm cho yêu cầu 'không đơn giản' và do đó yêu cầu phải được xem trước với yêu cầu OPTIONS.

Tôi có thể thấy jquery đưa ra yêu cầu OPTIONS, nhưng nó không gửi tiêu đề tùy chỉnh cùng.

Phương pháp tôi đã cố gắng:

Trong cả hai trường hợp, trình duyệt không gửi tiêu đề tùy chỉnh cùng .

Tôi đang sử dụng FF 17.0.1, jquery 1.8.3.

+0

Hiển thị mã của bạn nơi bạn đang cố đặt tiêu đề. – Barmar

+0

Tùy chọn 'tiêu đề: {Header-name: value}' tùy chọn không hoạt động? – Barmar

+0

Tên của tiêu đề gây ra vấn đề là gì? Tôi đồng ý với Barmar, hiển thị tất cả mã JS của bạn và yêu cầu/phản hồi có thể giúp gỡ lỗi điều này. – monsur

Trả lời

30

Vấn đề của bạn không phải với jquery, nó ở trong how CORS works. Gọi lại beforeSend của bạn có thể hoạt động như mong đợi ... nhưng các trình duyệt sẽ không gửi tiêu đề tùy chỉnh trong các yêu cầu preflight, bất kể là gì. Điều này là do thiết kế; mục đích của yêu cầu preflight là để xác định thông tin nào mà useragent (trình duyệt) được phép gửi vượt ra ngoài những thứ "đơn giản" được định nghĩa trong thông số CORS. Do đó, để useragent gửi bất kỳ dữ liệu không đơn giản nào (như tiêu đề tùy chỉnh của bạn) như một phần của yêu cầu preflight là tự đánh bại.

Để hướng dẫn useragent bao gồm tiêu đề tùy chỉnh của bạn trong yêu cầu CORS thực tế, hãy bao gồm Access-Control-Allow-Headers header trong phản hồi preflight của bạn. Cần lưu ý rằng nếu bạn không quá lo lắng về các tiêu đề truyền của người dùng, tôi tin rằng bạn có thể chỉ trả lại giá trị của trường tiêu đề yêu cầu Access-Control-Request-Headers làm giá trị của số Access-Control-Allow-Headers mà bạn gửi trong phản hồi.

Bạn cũng có thể muốn bao gồm một số tiêu đề Access-Control-Allow-* khác được xác định trong syntax section of the spec.

Xem thêm CORS - How do 'preflight' an httprequest?

Xem thêm Mozilla's CORS preflight example, trong đó cho thấy các tiêu đề trong hành động.

+1

Cảm ơn. Tôi có những thứ làm việc sau khi phản ứng preflight xảy ra, nó chỉ là cuộc gọi OPTIONS, đó là vấn đề. Có vẻ như tôi sẽ phải sử dụng giải pháp dựa trên máy chủ. – mooreds

+0

@mooreds - Bạn có thể cung cấp ảnh chụp nhanh các tiêu đề được gửi/nhận trong yêu cầu preflight không? Vấn đề là máy chủ của bạn đang từ chối yêu cầu OPTIONS vì nó không có tiêu đề tùy chỉnh? 'Đoán tôi không hiểu tại sao bạn cần giải pháp máy chủ vẫn còn nếu mọi thứ đang làm việc sau khi phản ứng preflight. – broofa

+0

có, yêu cầu OPTIONS đang bị từ chối vì nó không có tiêu đề tùy chỉnh.Trên chrome, phần còn lại của dữ liệu vẫn được gửi (có thể là do tôi đang phát triển trên localhost, không chắc chắn), nhưng đối với Firefox, khi yêu cầu OPTIONS thất bại, phần còn lại của yêu cầu không thành công. – mooreds

Các vấn đề liên quan