$.ajax()
Bir siteye giriş yaptıktan sonra , $.ajax()
o siteye ikinci bir istek göndermeye çalışıyorum - ancak FireBug kullanarak gönderilen başlıkları kontrol ettiğimde, isteğe dahil olan bir oturum çerezi yok.
Neyi yanlış yapıyorum?
$.ajax()
Bir siteye giriş yaptıktan sonra , $.ajax()
o siteye ikinci bir istek göndermeye çalışıyorum - ancak FireBug kullanarak gönderilen başlıkları kontrol ettiğimde, isteğe dahil olan bir oturum çerezi yok.
Neyi yanlış yapıyorum?
Yanıtlar:
AJAX çağrıları, yalnızca aradığınız url, çağrı komut dosyanızla aynı etki alanındaysa Çerez gönderir.
Bu bir Web Alanları Arası Sorun olabilir.
Belki www.domain-a.com
arama komut dosyanız açıkken bir url'yi aramayı denediniz www.domain-b.com
(Başka bir deyişle: Bir Alanlar Arası Arama yaptınız, bu durumda tarayıcı gizliliğinizi korumak için herhangi bir çerez göndermez).
Bu durumda seçenekleriniz:
Bu biraz yardımcı olsa sevindim.
path=/something
ve sayfayı talep ediyorsanız /another
, çerez gönderilmez. Sayfayı talep ettiğinizde /something
çerez beklendiği gibi gönderilir. Bu yüzden, çerezi ayarlayan kodu da kontrol edin.
Alanlar arası senaryoda çalışıyorum. Oturum açma sırasında uzak sunucu Set-Cookie üstbilgisini Access-Control-Allow-Credentials
true olarak ayarlanmış olarak döndürüyor .
Uzak sunucuya yapılan bir sonraki ajax çağrısı bu çerezi kullanmalıdır.
CORS'ler Access-Control-Allow-Credentials
etki alanları arası günlüğe kaydetmeye izin vermek için oradadır. Kontrol https://developer.mozilla.org/En/HTTP_access_control örnekler için.
Benim için JQuery'de bir hata gibi görünüyor (ya da en azından bir sonraki versiyonda olması gereken özellik).
GÜNCELLEME:
Çerezler AJAX yanıtından otomatik olarak ayarlanmaz (alıntı: http://aleembawany.com/2006/11/14/anatomy-of-a-well-designed-ajax-login-experience/ )
Neden?
Çerezin değerini, manuel olarak ayarlamak için yanıttan alamazsınız ( http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-getresponseheader )
Kafam karıştı..
Parametre jquery.ajax()
ayarlamayı istemenin bir yolu olmalıdır XMLHttpRequest.withCredentials = "true"
.
CEVAP: http://api.jquery.com/jQuery.ajax/xhrFields
parametresini
kullanmalısınız .
Belgelerdeki örnek şöyledir:
$.ajax({
url: a_cross_domain_url,
xhrFields: {
withCredentials: true
}
});
Sunucunun bu isteğe doğru yanıt vermesi de önemlidir. @ Frédéric ve @Pebbl'dan harika yorumlar kopyalanıyor:
Important note: when responding to a credentialed request, server must specify a domain, and cannot use wild carding. The above example would fail if the header was wildcarded as: Access-Control-Allow-Origin: *
Yani istek olduğunda:
Origin: http://foo.example
Cookie: pageAccess=2
Sunucu şu yanıtı vermelidir:
Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Credentials: true
[payload]
Aksi takdirde, yük betiğe geri gönderilmez. Bkz. Https://developer.mozilla.org/tr-TR/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials
Important note: when responding to a credentialed request, server must specify a domain, and cannot use wild carding. The above example would fail if the header was wildcarded as: Access-Control-Allow-Origin: *
developer.mozilla.org/en-US/docs/Web/HTTP/…
kullanma
xhrFields: { withCredentials:true }
jQuery ajax çağrımın bir parçası olarak çözümün sadece bir parçasıydı. Ben de kaynaklardan SEÇENEKLER yanıtı döndürülen başlıkları gerekiyordu:
Access-Control-Allow-Origin : http://www.wombling.com
Access-Control-Allow-Credentials : true
OPTIONS çağrısının yanıt başlığında "*" değil , yalnızca bir izin verilen "kaynak" ın olması önemlidir . Bunu isteğin kaynağını okuyarak ve yanıtı tekrar doldurarak başardım - muhtemelen kısıtlamanın orijinal nedenini atlattım, ancak benim kullanımımda güvenlik çok önemli değil.
W3C standardı boşlukla ayrılmış bir listeye izin verdiği için sadece tek bir köken gereksiniminden açıkça bahsetmeye değer olduğunu düşündüm - ama Chrome değil! http://www.w3.org/TR/cors/#access-control-allow-origin-response-header NB "uygulamada" biti.
Bunu init işlevinize koyun:
$.ajaxSetup({
xhrFields: {
withCredentials: true
}
});
Çalışacak.
Bu soruya zaten çok iyi yanıtlar var, ancak çerez alanıyla eşleştiği için oturum çerezinin gönderilmesini beklediğiniz durumu açıklığa kavuşturmanın yararlı olabileceğini düşündüm, ancak AJAX isteği olduğu için gönderilmiyor farklı bir alt alana yapılır. Bu durumda, ben atanmış bir çerez * .etkialanim.com etki ve bunu için bir AJAX isteği dahil edilecek isteyen ediyorum different.mydomain.com ". Varsayılan olarak, çerez gönderildiğinde almaz. Bu sorunu çözmek için oturum çerezinde HTTPONLY özelliğini devre dışı bırakmanız gerekmez.Yalnızca womblingin önerisini ( https://stackoverflow.com/a/23660618/545223 ) yapmanız ve aşağıdakileri yapmanız gerekir.
1) Ajax isteğinize aşağıdakileri ekleyin.
xhrFields: { withCredentials:true }
2) Farklı alt alanlardaki kaynaklar için yanıt başlıklarınıza aşağıdakileri ekleyin.
Access-Control-Allow-Origin : http://original.mydomain.com
Access-Control-Allow-Credentials : true
Diğer çözümleri denedikten ve hala işe yaramadıktan sonra, benim durumumda sorunun ne olduğunu öğrendim. ContentType'ı "application / json" yerine "text / plain" olarak değiştirdim.
$.ajax(fullUrl, {
type: "GET",
contentType: "text/plain",
xhrFields: {
withCredentials: true
},
crossDomain: true
});
Ben de aynı sorunu yaşıyordu ve bazı kontroller sadece benim scriptid sadece çerez almak değildi kontroller yapıyor.
Ben benim çerçeve (Django) varsayılan olarak HttpOnly ile sessionid çerez geçiyordu tarayıcıda sessionid çerez değerine bakarak anladım. Bu, komut dosyalarının oturum kimliği değerine erişimi olmadığı ve bu nedenle isteklerle birlikte geçirmediği anlamına geliyordu. Pek çok şey erişim kısıtlaması gerektiren Ajax kullandığında HttpOnly'nin varsayılan değer olacağı saçma.
Bunu düzeltmek için bir ayarı değiştirdim (SESSION_COOKIE_HTTPONLY = False), ancak diğer durumlarda çerez yolunda bir "HttpOnly" bayrağı olabilir
Yukarıdaki yanıtlarda açıklanan adımlara ek localhost
olarak localhost üzerinde veya bir bağlantı noktası geliştiriyorsanız localhost:8080
, Set-Cookie başlığında bir alan adı değeri geçmediğinizden emin olmanız gerekir.
Etki alanını localhost
Set-Cookie başlığında ayarlayamazsınız - bu yanlıştır - yalnızca alanı atlayın.
Açık etki alanına sahip localhost'taki çerezlere bakın ve asp.net neden localhost'ta çerez oluşturmaz?
Localhost ve dev ortamında PHPSESSID çerez sorununu ayarlama konusunda sadece 2 sentim. Ben locahost benim REST API uç noktasına AJAX çağrısı yapmak. Adresinin olduğunu söyleyin mysite.localhost/api/member/login/
(geliştirici ortamımdaki virtal host).
Postacı'da bu isteği yaptığımda işler iyi gidiyor ve PHPSESSID yanıtla ayarlanıyor.
Bu son noktayı AJAX aracılığıyla Browsersync proxy sayfasından istediğimde (örneğin, 122.133.1.110:3000/test/api/login.php
tarayıcı adres mysite.localhost
satırımdan etki alanının farklı olup olmadığına bakın) PHPSESSID çerezler arasında görünmüyor.
Bu isteği doğrudan aynı etki alanındaki sayfadan yaptığımda (yani mysite.localhost/test/api/login.php
) PHPSESSID iyi ayarlanmış.
Yani bu, yukarıdaki @flu yanıtında belirtildiği gibi, bir menşe köken isteği çerezleri sorunu
Başka birine yardımcı olması durumunda senaryomu ve çözümümü ekleme. RESTful API'leri kullanırken benzer bir durumla karşılaştım. HTML / Script / CSS dosyalarını barındıran Web sunucum ve API'leri açığa çıkaran Uygulama Sunucusu aynı etki alanında barındırıldı. Ancak yol farklıydı.
web sunucusu - alan adım / web sayfaları /abc.html
Kullanılmış abc.js seti çerez adında MyCookie
uygulama sunucusu - alan adım / webapis / hizmetadı.
api çağrılarının yapıldığı
Mydomain / webapis / servicename içinde çerez bekliyordum ve okumaya çalıştım ama gönderilmiyordu. Cevabın yorumunu okuduktan sonra tarayıcının geliştirme aracında mycookie'nin yolunun "/ webpages " olarak ayarlandığını ve dolayısıyla
etkialanım / webapis / hizmet adı
Yani jquery'den çerez ayarlarken, bunu yaptım -
$.cookie("mycookie","mayvalue",{**path:'/'**});
Belki% 100 soruyu cevaplamak değil, ama ajax innovastudio editörünün assetmanager bir dosya yüklerken bir oturum sorunu çözme umuduyla tökezledi. Sonunda çözüm basitti: flash yükleyicileri var. Devre dışı bırakma (ayar
var flashUpload = false;
varlık.php) ve ışıklar tekrar yanıp sönmeye başladı.
Bu sorunları ayıklamak çok zor olabileceğinden, yükleme işleyicisine aşağıdakine benzer bir şey koymanın sizi doğru yolda ayarlayacağını buldum:
$sn=session_name();
error_log("session_name: $sn ");
if(isset($_GET[$sn])) error_log("session as GET param");
if(isset($_POST[$sn])) error_log("session as POST param");
if(isset($_COOKIE[$sn])) error_log("session as Cookie");
if(isset($PHPSESSID)) error_log("session as Global");
Günlüğe bir dalış ve ben hiçbir çerez gönderildiği eksik oturumu hemen gördüm.
session_name(isset($_GET['sess']) ? $_GET['sess'] : null);session_start();
bu şekilde ayarlayabilir , böylece bir şey elde ederlerdi