2013-01-22 33 views
44

Dường như một cái gì đó tương tự đã được thảo luận trên stackoverflow, nhưng tôi không thể tìm thấy chính xác như vậy.Yêu cầu POST tên miền chéo không gửi cookie Ajax Jquery

Tôi đang cố gắng gửi Cookie bằng CORS (Chia sẻ tài nguyên gốc) nhưng không hoạt động.

Đây là mã của tôi.

$.ajax(
    { 
     type: "POST", 
     url: "http://example.com/api/getlist.json", 
     dataType: 'json', 
     xhrFields: { 
      withCredentials: true 
     }, 
     crossDomain: true, 
     beforeSend: function(xhr) { 
      xhr.setRequestHeader("Cookie", "session=xxxyyyzzz"); 
     }, 
     success: function(){ 
      alert('success'); 
     }, 
     error: function (xhr) { 
      alert(xhr.responseText); 
     } 
    } 
); 

Tôi không thấy cookie này theo yêu cầu HEADER.

+0

http://stackoverflow.com/questions/3342140/cross-domain-cookies –

Trả lời

51

Bạn không thể đặt hoặc đọc cookie trên các yêu cầu CORS thông qua JavaScript. Mặc dù CORS cho phép các yêu cầu có nguồn gốc chéo, các cookie vẫn phải tuân theo chính sách có cùng nguồn gốc của trình duyệt, điều này có nghĩa là chỉ các trang có cùng nguồn gốc mới có thể đọc/ghi cookie. withCredentials chỉ có nghĩa là bất kỳ cookie nào được thiết lập bởi máy chủ từ xa sẽ được gửi đến máy chủ từ xa đó. Bạn sẽ phải đặt cookie từ máy chủ từ xa bằng cách sử dụng tiêu đề Set-Cookie.

+0

Điều đó thật kỳ lạ. Tại sao tôi không thể chuyển cookie trong Header? –

+2

Mặc dù CORS cho phép yêu cầu xuất xứ chéo, các cookie vẫn phải tuân thủ chính sách cùng nguồn gốc của trình duyệt, có nghĩa là chỉ các trang có cùng nguồn gốc mới có thể đọc/ghi cookie. – monsur

+0

Cảm ơn mọi người. Có vẻ như không có thảo luận ở đây. –

18

Xin lưu ý rằng điều này không giải quyết được quy trình chia sẻ cookie, vì nói chung đây là thực tiễn không tốt.

Bạn cần phải sử dụng JSONP as type của bạn:

Từ $ .ajax tài liệu: yêu cầu Cross-domain và datatype: "jsonp" yêu cầu không hỗ trợ hoạt động đồng bộ.

$.ajax(
    { 
     type: "POST", 
     url: "http://example.com/api/getlist.json", 
     dataType: 'jsonp', 
     xhrFields: { 
      withCredentials: true 
     }, 
     crossDomain: true, 
     beforeSend: function(xhr) { 
      xhr.setRequestHeader("Cookie", "session=xxxyyyzzz"); 
     }, 
     success: function(){ 
      alert('success'); 
     }, 
     error: function (xhr) { 
      alert(xhr.responseText); 
     } 
    } 
); 
+2

Cảm ơn @Justin Schuhmann Thật sự tôi thực sự cần phải thực hiện CORS yêu cầu, không JSONP. CORS có hỗ trợ cookie không? –

+0

Xin chào, Trên thực tế sử dụng dataType: "văn bản", đã làm việc cho tôi như một sự quyến rũ! Cảm ơn! –

+1

Thực hành xấu là gì? Sử dụng cookie trong các yêu cầu CORS? Nếu vậy, tại sao nó là thực hành xấu? – Mnebuerquo

5

Tôi gặp vấn đề tương tự. ID phiên được gửi trong cookie, nhưng vì yêu cầu là tên miền chéo, cài đặt bảo mật của trình duyệt sẽ chặn cookie được gửi.

Giải pháp: Tạo ID phiên trên máy khách (trong trình duyệt), sử dụng JavaScript sessionStorage để lưu ID phiên sau đó gửi ID phiên với từng yêu cầu đến máy chủ.

Tôi đã gặp nhiều khó khăn với vấn đề này và không có nhiều câu trả lời hay. Dưới đây là một bài viết chi tiết giải pháp: Javascript Cross-Domain Request With Session

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