AJAX yanıtı bir çerez ayarlayabilir mi?


266

AJAX yanıtı bir çerez ayarlayabilir mi? Değilse, alternatif çözümüm nedir? Javascript veya benzeri bir şeyle mi ayarlamalıyım?


Node.js Express kullanıyorum. Bunu yaparsanız, sunucu tarafında httpOnly alanını false olarak ayarlamanız gerektiğini fark ettim.
Chong Lip Phang

Yanıtlar:


247

Evet , sunucu normal bir istek için yaptığınız gibi sunucu tarafı kodundaki AJAX isteğinde de çerez ayarlayabilirsiniz, çünkü sunucu normal bir istek veya AJAX isteği arasında ayrım yapamaz.

AJAX istekleri sadece sunucuya istekte bulunmanın özel bir yoludur, sunucunun herhangi bir HTTP isteğinde olduğu gibi yanıt vermesi gerekir. İsteğin cevabında çerez ekleyebilirsiniz.


39
Çerezin HTTP aracısı tarafından kabul edilip edilmeyeceğinin başka bir hikaye olduğunu unutmayın.
Franci Penov

6
@Franci: kabul etti. Ancak bu sorunun yalnızca çerez destekleyen http istemcileri için anlamlı olduğunu düşünüyorum. Yani tüm soru-asker sadece AJAX isteği çerezleri yazılabilir olmadığını bilmek istiyor onun UA anlamına çerezleri destekler :)
bu. __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 adresinden
smwikipedia

12
Sunucu, bir Set-Cookie üstbilgisi ile bir ajax isteğine yanıt verebiliyorsa bu yanıt verilir. Ve tabii ki olabilir, ancak soru bu cevabın gerçekten müşterinin ajax cevabında alınan çerezi okuması ve ayarlamasıyla mı yoksa manuel olarak mı yapılmasıyla sonuçlanıp sonuçlanmayacağıdır. Bu bir cevap değil.
Alex

2
@Legends Ajax istekleri genellikle XHedp-Başlığı XMLHttpRequest olarak ayarlandığında, bu şekilde tanımlanabilir, ancak bu başlık olmadan istek yapılabilir, bu olursa normal sayfa yükünden ayırt edilemez
T0m

292

XMLHttpRequest için w3 spesifikasyonu bölüm 4.6.3'e göre, bir kullanıcı aracısı Set-Cookie başlığına uymalıdır. Yani cevap, evet, yapabilmeniz gerekir.

tırnak:

Kullanıcı aracısı HTTP Durum Yönetimi'ni destekliyorsa, geçerli olarak çerezleri (Set-Cookie yanıt başlığında alınan ve Çerez başlığında gönderilen şekilde) atmalı ve göndermelidir.


1
IE, XHR yanıtları durumunda yanıtlarda Set-Cookie başlığını destekliyor mu?
detj

Bir yönlendirmede olması gerektiği gibi ve bazı tarayıcılarda onurlandırmaz.
Walter Macambira

1
Chrome'u kullanmam için, ajax isteklerinde alınan başlıklar otomatik olarak istemciye uygulanacak.
Alex

Sunucu tarafı yanıtı gzip olarak ayarlıyorsa, çerezin ayarlanmadığını fark ettim. Bunun spesifikasyonun bir parçası olması mı gerekiyor yoksa bu sadece bir uygulama meselesi mi?
juminoz

89

Kayıt için, yalnızca AJAX çağrısı aynı etki alanında yapıldığında yukarıdakilerin hepsinin (hala) doğru olduğu tavsiye edilir. AJAX kullanarak başka bir alandaki çerezleri ayarlamayı düşünüyorsanız, tamamen farklı bir solucan kutusu açıyorsunuz . Bununla birlikte, etki alanları arası çerezleri okumak işe yarar (veya en azından sunucu onlara hizmet eder; müşterinizin UA'sının kodunuzun bunlara erişmesine izin verip vermediği, yine farklı bir konudur; 2014 itibariyle).


26
Web alanları arası çerezler göndermek için withCredentials bayrağını ayarlamanız gerekir
aeosynth

5
Sete (1) Müşteri ihtiyaçlarını -: alanlar arası senaryosu için, 3 şeyler olmaya gerek withCredentials=trueiçin xhrnesnenin (2) Set Access-Control-Allow-Credentialshem SEÇENEKLER uçuş öncesi isteği yanısıra gerçek istek (3) gerektiği gibi ayarlayın çerezinde
Kunal

6

Ayrıca, sunucunuzun http olmayan bir istekte güvenli çerezler ayarlamadığını kontrol edin. Sadece benim ajax isteği "güvenli" seti ile bir php oturumu alıyordu öğrendim. Https'de olmadığım için oturum çerezini geri göndermiyordum ve oturumum her ajax isteğinde sıfırlanıyordu.


bana söyleyebilir misin, nerede kontrol ajax güvenli olup olmadığını kontrol edebilirsiniz?
Ziumper

1
Gerçekten ajax'a özgü değil. Güvenli olmayan http: //
Phil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.