2014-06-11 18 views
9

Tôi đã thiết lập biểu mẫu tải lên tệp đơn giản bằng cách sử dụng cuộc gọi ajax của jQuery đến tên miền khác. Trình duyệt có cookie cho miền và cookie này được gửi cùng với yêu cầu trong Firefox. Tuy nhiên, cookie không có trong Chrome, dẫn đến việc không đăng nhập được. Tôi đã xác minh rằng cookie không tồn tại trong Chrome, nó không được gửi cùng với yêu cầu.Cookie CORS không được gửi trong Chrome

Cuộc gọi ajax: Một số điều này có thể không cần thiết. Nó đã được thêm vào các giải pháp liên quan và cố gắng để chứng minh những nỗ lực đó.

<head> 
    <script src="jquery-2.1.1.min.js"></script> 
</head> 

<form enctype="multipart/form-data" id="file" method="POST"> 
    <input name="file" type="file" /> 
    <input name="Submit" type="button" id="upload"/> 
</form> 

<script type="text/javascript"> 
    $.support.cors = true 

    $('input#upload').click(function(){ 
     var formData = new FormData($('form#file')[0]); 

     .ajax({ 
      url: 'http://accounts.mysite.dev/file/saveasset', 
      type: 'POST', 
      data: formData, 
      cache: false, 
      contentType: false, 
      processData: false, 
      xhrFields: { 
       withCredentials: true 
      }, 
      crossDomain: true 
     }); 
    }); 
</script> 

Firefox sẽ gửi tiêu đề chính xác, bao gồm cookie của người dùng

POST /file/saveasset HTTP/1.1 
Host: accounts.mysite.dev 
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:29.0) Gecko/20100101 Firefox/29.0 
Accept: */* 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
DNT: 1 
Referer: http://phptest/htmltest/fileUpload.html 
Content-Length: 8032 
Content-Type: multipart/form-data; boundary=---------------------------4450073521062221055385143281 
Origin: http://phptest 
Cookie: Accounts=somecookiestuff 
Connection: keep-alive 
Pragma: no-cache 
Cache-Control: no-cache 

Nhưng Chrome thì không

POST /file/saveasset HTTP/1.1 
Host: accounts.mysite.dev 
Content-Length: 7981 
Accept: */* 
Origin: http://phptest 
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/34.0.1847.116 Chrome/34.0.1847.116 Safari/537.36 
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryGyMYxvKgEKWfBR5x 
Referer: http://phptest/htmltest/fileUpload.html 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 

Tôi tin rằng các máy chủ được thiết lập một cách chính xác để cho phép nguồn gốc này và các thông tin nhưng chúng thậm chí không được gửi trong yêu cầu của Chrome. Trong trường hợp nó có liên quan, máy chủ của tôi (php w/Zend) đặt

$this->_response->setHeader('Access-Control-Allow-Origin', 'http://phptest'); 
$this->_response->setHeader('Access-Control-Allow-Credentials', 'true'); 

Tôi không thấy bất kỳ yêu cầu preflight OPTION nào trên máy chủ.

Tại sao Chrome không gửi cookie của tôi?

+0

Cookie nào bạn muốn thấy trong Chrome đang được đặt trong FF? Cả hai yêu cầu đều có tiêu đề 'Origin'. – Palpatim

+0

Tiêu đề cookie. –

Trả lời

13

Kiểm tra xem Chrome được thiết lập để chặn 3rd party cookies:

menu → Cài đặt → Hiện Advanced Settings ... → Bảo mật: Cài đặt nội dung

Hãy chắc chắn rằng "Chặn cookie của bên thứ ba và dữ liệu trang web" là không được chọn. Hoặc, nếu bạn có thứ khác chặn cookie của bên thứ ba, hãy tắt tính năng này.

Có vấn đề tương tự khi thực hiện yêu cầu JSONP chéo trang web, cookie không được gửi cùng với bất kỳ yêu cầu thẻ nào trên các tên miền.

+0

Tuyệt vời! Tôi không _think_ đây là thiết lập mặc định vì vậy tôi phải thay đổi nó tại một số điểm. –

+0

Có cách nào khác để thực hiện việc này ngoài việc thay đổi cài đặt? –

+0

Đây chỉ là một trong những nhà phát triển của chúng tôi và tốn một chút thời gian. Cám ơn vì cái này. – radicalmatt

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