2010-07-27 26 views
216

Phản hồi AJAX có thể đặt cookie không? Nếu không, giải pháp thay thế của tôi là gì? Tôi có nên thiết lập nó với Javascript hoặc một cái gì đó tương tự?Phản hồi AJAX có thể đặt cookie không?

+0

Tôi đang sử dụng nút tốc độ node.js. Tôi nhận thấy rằng nếu bạn làm điều đó, bạn phải đặt trường httpOnly thành false ở phía máy chủ quá rõ ràng. –

Trả lời

199

, bạn có thể đặt cookie trong yêu cầu AJAX trong mã phía máy chủ giống như bạn yêu cầu bình thường vì máy chủ không thể phân biệt giữa yêu cầu bình thường hoặc yêu cầu AJAX.

Yêu cầu AJAX chỉ là một cách đặc biệt để yêu cầu đến máy chủ, máy chủ sẽ cần phản hồi như trong bất kỳ yêu cầu HTTP nào. Trong phản ứng của yêu cầu, bạn có thể thêm cookie.

+31

Hãy nhớ rằng liệu cookie sẽ được đại diện HTTP vinh danh là một câu chuyện khác hay không. –

+6

@Franci: đã đồng ý. Nhưng tôi nghĩ câu hỏi này chỉ có ý nghĩa đối với các khách hàng http hỗ trợ cookie. Vì vậy, tất cả người hỏi chỉ muốn biết liệu cookie có thể được viết trong yêu cầu AJAX có nghĩa là UA của anh ấy hỗ trợ cookie :) –

+7

'Nếu tác nhân người dùng hỗ trợ Quản lý trạng thái HTTP, nó sẽ tồn tại, loại bỏ và gửi cookie (như đã nhận trong Set- Tiêu đề phản hồi cookie và được gửi trong tiêu đề Cookie) có thể áp dụng.' - từ http://www.w3.org/TR/XMLHttpRequest/ – smwikipedia

264

Theo số w3 spec section 4.6.3 for XMLHttpRequest tác nhân người dùng nên tôn trọng tiêu đề Đặt cookie. Vì vậy, câu trả lời là có bạn sẽ có thể.

Báo giá:

Nếu user agent hỗ trợ quản lý nhà nước HTTP cần kiên trì, loại bỏ và gửi các tập tin cookie (như nhận được trong Set-Cookie phản ứng header, và gửi trong header Cookie) có thể áp dụng .

+35

+1 để tham khảo –

+1

IE có hỗ trợ tiêu đề Set-Cookie trong phản hồi, trong trường hợp có phản hồi XHR không? – detj

+0

Vì nó nên chuyển hướng và nó không tôn trọng trong một số trình duyệt. –

78

Để ghi lại, lưu ý rằng tất cả những điều trên là (vẫn) chỉ đúng nếu cuộc gọi AJAX được thực hiện trên cùng một tên miền. Nếu bạn đang xem xét việc đặt cookie trên một tên miền khác bằng cách sử dụng AJAX, bạn đang mở một hoàn toàn khác nhau can of worms. Tuy nhiên, việc đọc các cookie tên miền chéo không hoạt động (hoặc ít nhất là máy chủ phục vụ chúng; liệu UA của khách hàng của bạn có cho phép mã của bạn truy cập vào chúng không, một lần nữa, một chủ đề khác, kể từ năm 2014).

+5

Cảm ơn bạn đã đặt điều này vào. Đó là những gì tôi đang tìm kiếm khi tôi bắt gặp điều này.^__^ – adiktofsugar

+21

Để gửi cookie tên miền chéo, bạn cần đặt [withCredentials] (https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control#Requests_with_credentials) flag – aeosynth

+4

Đối với kịch bản miền chéo, 3 điều cần phải xảy ra: - (1) Khách hàng cần đặt 'withCredentials = true' cho đối tượng' xhr' (2) Đặt 'Access-Control-Allow-Credentials' cả trong OPTIONS yêu cầu preflight cũng như yêu cầu thực tế (3) Đặt cookie khi cần – Kunal

5

Ngoài ra, hãy kiểm tra xem máy chủ của bạn có đang đặt cookie an toàn không theo yêu cầu http hay không. Chỉ cần phát hiện ra rằng yêu cầu ajax của tôi đã nhận được một phiên php với bộ "an toàn". Bởi vì tôi đã không được trên https nó đã không gửi lại cookie phiên và phiên của tôi đã được thiết lập lại trên mỗi yêu cầu ajax.

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