การตอบกลับ AJAX สามารถตั้งค่าคุกกี้ได้หรือไม่?


266

การตอบกลับ AJAX สามารถตั้งค่าคุกกี้ได้หรือไม่? ถ้าไม่เป็นทางเลือกของฉันคืออะไร ฉันควรตั้งค่าด้วย Javascript หรืออะไรที่คล้ายกัน?


ฉันกำลังใช้ node.js Express ฉันสังเกตเห็นว่าถ้าคุณทำเช่นนั้นคุณจะต้องตั้งค่าฟิลด์ httpOnly เป็นเท็จที่ฝั่งเซิร์ฟเวอร์อย่างชัดเจน
ปากช่องปากพัง

คำตอบ:


247

ใช่คุณสามารถตั้งค่าคุกกี้ในคำขอ AJAX ในรหัสฝั่งเซิร์ฟเวอร์เช่นเดียวกับที่คุณทำกับคำขอปกติเนื่องจากเซิร์ฟเวอร์ไม่สามารถแยกความแตกต่างระหว่างคำขอปกติหรือคำขอ AJAX

คำขอ AJAX เป็นเพียงวิธีพิเศษในการร้องขอไปยังเซิร์ฟเวอร์เซิร์ฟเวอร์จะต้องตอบกลับเช่นเดียวกับคำขอ HTTP ใด ๆ ในการตอบกลับคำขอคุณสามารถเพิ่มคุกกี้ได้


39
โปรดทราบว่าการที่คุกกี้จะได้รับเกียรติจากเอเจนต์ HTTP นั้นเป็นอีกเรื่องหนึ่ง
Franci Penov

6
@ ฟรานซิ: ตกลง แต่ฉันคิดว่าคำถามนี้สมเหตุสมผลสำหรับลูกค้า http ที่สนับสนุนคุกกี้เท่านั้น ดังนั้นผู้ถามคำถามทุกคนต้องการทราบว่าคุกกี้สามารถเขียนได้ในคำขอ AJAX ซึ่งหมายความว่า UA ของเขาสนับสนุนคุกกี้ :)
สิ่งนี้ __curious_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.- จากw3.org/TR/XMLHttpRequest
smwikipedia

12
คำตอบนี้หากเซิร์ฟเวอร์สามารถตอบคำขอ ajax ด้วยส่วนหัว Set-Cookie และแน่นอนมันสามารถทำได้ แต่คำถามก็คือว่าการตอบสนองนั้นจะส่งผลให้ลูกค้าอ่านและตั้งค่าคุกกี้ที่ได้รับในการตอบกลับ ajax หรือว่าต้องทำด้วยตนเอง นี่ไม่ใช่คำตอบสำหรับสิ่งนั้น
อเล็กซ์

2
@Legends คำขอ Ajax มักจะมี X-Requested-With ที่ถูกตั้งค่าเป็น XMLHttpRequest นี่คือวิธีที่พวกเขาสามารถระบุได้ แต่การร้องขอสามารถทำได้โดยไม่มีส่วนหัวนี้หากสิ่งนี้เกิดขึ้นมันไม่สามารถแยกความแตกต่างจากโหลดหน้าปกติ
T0m

292

ตามข้อมูลจำเพาะ w3 ส่วน 4.6.3 สำหรับ XMLHttpRequestตัวแทนผู้ใช้ควรเคารพส่วนหัว Set-Cookie ดังนั้นคำตอบคือใช่คุณควรจะสามารถ

คำอ้างอิง:

หากตัวแทนผู้ใช้สนับสนุนการจัดการสถานะ HTTP ควรคงอยู่ให้ทิ้งและส่งคุกกี้ (ตามที่ได้รับในส่วนหัวการตอบสนองของ Set-Cookie และส่งในส่วนหัวของคุกกี้) ตามความเหมาะสม


1
IE สนับสนุนส่วนหัว Set-Cookie ในการตอบสนองหรือไม่ในกรณีที่มีการตอบสนอง XHR
detj

ตามควรในการเปลี่ยนเส้นทางและไม่ให้เกียรติในเบราว์เซอร์บางตัว
Walter Macambira

1
สำหรับฉันที่ใช้ Chrome ส่วนหัวที่ได้รับในคำขอ ajax จะถูกนำไปใช้กับลูกค้าโดยอัตโนมัติ
Alex

ฉันพบว่าหากฝั่งเซิร์ฟเวอร์ตั้งค่าการตอบกลับเป็น gzip คุกกี้จะไม่ได้รับการตั้งค่า ควรจะเป็นส่วนหนึ่งของข้อมูลจำเพาะหรือว่าเป็นเพียงปัญหาการดำเนินการหรือไม่
juminoz

89

สำหรับเรคคอร์ดโปรดทราบว่าสิ่งที่กล่าวมาทั้งหมดนี้ยังคงเป็นจริงต่อเมื่อมีการโทร AJAX บนโดเมนเดียวกัน หากคุณกำลังมองหาในการตั้งค่าคุกกี้บนโดเมนอื่นใช้ AJAX คุณกำลังเปิดที่แตกต่างกันโดยสิ้นเชิงสามารถของเวิร์ อย่างไรก็ตามการอ่านคุกกี้ข้ามโดเมนใช้งานได้ (หรืออย่างน้อยเซิร์ฟเวอร์จะให้บริการพวกเขาหรือไม่ว่า UA ของลูกค้าของคุณจะอนุญาตให้รหัสของคุณเข้าถึงพวกเขาคืออีกครั้งหัวข้อที่แตกต่างกัน;


26
ที่จะส่งคุกกี้ข้ามโดเมนคุณจะต้องตั้งค่าwithCredentialsธง
aeosynth

5
สำหรับสถานการณ์ข้ามโดเมนจำเป็นต้องเกิดขึ้น 3 สิ่ง: - (1) ไคลเอนต์จำเป็นต้องตั้งค่าwithCredentials=trueสำหรับxhrวัตถุ (2) ตั้งค่าAccess-Control-Allow-Credentialsทั้งสองในคำขอ preflight OPTIONS เช่นเดียวกับคำขอจริง (3) ตั้งค่าคุกกี้ตามต้องการ
Kunal

6

ตรวจสอบด้วยว่าเซิร์ฟเวอร์ของคุณไม่ได้ตั้งค่าคุกกี้ที่ปลอดภัยในคำขอ http ที่ไม่ใช่ เพิ่งพบว่าคำขอ ajax ของฉันได้รับเซสชัน php ด้วยชุด "ปลอดภัย" เนื่องจากฉันไม่ได้อยู่บน https จึงไม่ได้ส่งคุกกี้เซสชันกลับมาและเซสชันของฉันได้รับการรีเซ็ตตามคำขออาแจ็กซ์แต่ละครั้ง


คุณบอกฉันได้ไหมว่าที่ไหนที่ฉันสามารถตรวจสอบได้มีการตั้งค่า ajax secure?
Ziumper

1
มันไม่ได้เป็นอาแจ็กซ์ที่เฉพาะเจาะจงจริงๆ ตรวจสอบ "ความปลอดภัย" ในการตอบสนองส่วนหัว Set-Cookie จากเซิร์ฟเวอร์หากคุณใช้ http ที่ไม่ปลอดภัย http: //
Phil
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.