Phản hồi AJAX có thể đặt cookie không?


266

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ự?


Tôi đang sử dụng node.js Express. 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.
Chong Lip Phang

Câu trả lời:


247

, bạn có thể đặt cookie trong yêu cầu AJAX theo mã phía máy chủ giống như bạn làm cho một 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 máy chủ, máy chủ sẽ cần phản hồi lại như trong bất kỳ yêu cầu HTTP nào. Trong phản hồi của yêu cầu, bạn có thể thêm cookie.


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

6
@Franci: đồng ý. Nhưng tôi nghĩ rằng câu hỏi chỉ có ý nghĩa đối với các khách hàng http hỗ trợ cookie. Vì vậy, tất cả những người hỏi đều 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 hay không :)
điều này. __cquil_geek

10
If the user agent supports HTTP State Management it should persist, discard and send cookies (as received in the Set-Cookie response header, and sent in the Cookie header) as applicable.- từ w3.org/TR/XMLHttpRequest
smwikipedia

12
Câu trả lời này nếu máy chủ có thể trả lời yêu cầu ajax với tiêu đề Set-Cookie. Và tất nhiên là có thể, nhưng câu hỏi đặt ra là liệu phản hồi đó có thực sự dẫn đến việc khách hàng đọc và đặt cookie nhận được trong phản hồi ajax hay không, nếu nó phải được thực hiện thủ công. Đây không phải là một câu trả lời cho điều đó.
Alex

2
@Legends Các yêu cầu Ajax thường có tiêu đề X-Requested-With được đặt thành XMLHttpRequest, đây là cách chúng có thể được xác định, nhưng một yêu cầu có thể được thực hiện mà không có tiêu đề này, nếu điều này xảy ra thì không thể phân biệt được với tải trang bình thường
T0m

292

Theo phần đặc tả w3 4.6.3 cho XMLHttpRequest, một tác nhân người dùng nên tôn trọng tiêu đề Set-Cookie. Vì vậy, câu trả lời là có, bạn sẽ có thể.

Bảng báo giá:

Nếu tác nhân người dùng hỗ trợ Quản lý trạng thái HTTP, thì nó vẫn tồn tại, loại bỏ và gửi cookie (như đã nhận được trong tiêu đề phản hồi Set-Cookie và gửi trong tiêu đề Cookie) nếu có.


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

Như nó nên trên một chuyển hướng, và nó không tôn vinh trong một số trình duyệt.
Walter Macambira

1
Đối với tôi khi sử dụng Chrome, các tiêu đề nhận được trong yêu cầu ajax sẽ tự động được áp dụng cho khách hàng.
Alex

Tôi thấy rằng nếu phía máy chủ đang thiết lập lại phản hồi là gzip, cookie sẽ không được đặt. Đó có phải là một phần của thông số kỹ thuật không hay chỉ là vấn đề thực hiện?
juminoz

89

Đối với bản ghi, lưu ý rằng tất cả những điều trên chỉ đúng (nếu) chỉ khi 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 AJAX, thì bạn đang mở một hộp giun hoàn toàn khác . Tuy nhiên, đọc cookie tên miền chéo vẫn 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 hay không, lại là một chủ đề khác; kể từ năm 2014 chúng làm).


26
Để gửi các tập tin cookie cross-domain, bạn cần phải thiết lập các withCredentials cờ
aeosynth

5
Đối với kịch bản tên miền chéo, có 3 điều cần phải xảy ra: - (1) Máy khách cần đặt withCredentials=truecho xhrđối tượng (2) Đặt Access-Control-Allow-Credentialscả hai trong yêu cầu chọn trước TÙY CHỌN cũng như yêu cầu thực tế (3) Đặt cookie khi cần
Kunal

6

Đồng thời kiểm tra xem máy chủ của bạn không đặt cookie an toàn theo yêu cầu không http. 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". Vì tôi không ở trên https nên nó đã không gửi lại cookie phiên và phiên của tôi đang được đặt lại theo từng yêu cầu ajax.


bạn có thể cho tôi biết, nơi tôi có thể kiểm tra xem ajax có an toàn không?
Ziumper

1
Nó không thực sự ajax cụ thể. Kiểm tra "Bảo mật" trong phản hồi tiêu đề Set-Cookie từ máy chủ nếu bạn đang sử dụng http: //
Phil
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.