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?
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
Tiêu đề cookie. –