Dlaczego metoda jQuery. ajax() nie wysyła mojego pliku cookie sesji?
Po zalogowaniu się przez $.ajax()
na stronę, Próbuję wysłać drugie $.ajax()
żądanie na tę stronę - ale kiedy sprawdzam nagłówki wysłane za pomocą FireBug, nie ma pliku cookie sesji w żądaniu.
11 answers
Połączenia AJAX wysyłają Pliki cookie tylko wtedy, gdy adres URL, do którego dzwonisz, znajduje się w tej samej domenie, co skrypt wywołujący.
Może to być problem między domenami.
Być może próbowałeś wywołać adres URL z www.domain-a.com
, gdy twój skrypt wywołujący był włączony www.domain-b.com
(Innymi słowy: wykonałeś połączenie między domenami, w którym to przypadku przeglądarka nie wysyła żadnych plików cookie, aby chronić Twoją prywatność).
W tym przypadku twoje opcje to:
- napisz mały proxy, który znajduje się na domenie-b i przekazuje Twoje żądania do domeny-a. twoja przeglądarka pozwoli Ci na wywołanie proxy, ponieważ znajduje się na tym samym serwerze, co skrypt wywołujący.
ten serwer proxy może być skonfigurowany tak, aby akceptował nazwę pliku cookie i parametr wartości, który może wysłać do domain-a. ale aby to działało, musisz znać nazwę pliku cookie i wartość serwera domain-a chce uwierzytelniania. - jeśli pobierasz obiekty JSON, spróbuj zamiast tego użyć żądania JSONP. jQuery obsługuje te. Ale musisz zmienić Twój serwis na domenie-a tak, że zwraca poprawne odpowiedzi JSONP.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-14 10:00:09
Działam w scenariuszu między domenami. Podczas logowania zdalny serwer zwraca nagłówek Set-Cookie wraz z {[3] } ustawionym na true.
Następne wywołanie ajax do serwera zdalnego powinno używać tego pliku cookie.
Kors {[3] } jest tam, aby umożliwić rejestrowanie między domenami. Sprawdź https://developer.mozilla.org/En/HTTP_access_control na przykład.
Dla mnie wygląda to na błąd w JQuery (a przynajmniej feature-to-be W next wersja).
Aktualizacja:
-
Pliki cookie nie są ustawiane automatycznie z odpowiedzi AJAX (cytat: http://aleembawany.com/2006/11/14/anatomy-of-a-well-designed-ajax-login-experience/)
Dlaczego? -
Nie można uzyskać wartości pliku cookie z odpowiedzi, aby ustawić go ręcznie ( http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-getresponseheader )
Jestem zdezorientowany..
Powinien istnieć sposób, aby poprosić
jquery.ajax()
o ustawienieXMLHttpRequest.withCredentials = "true"
parametr.
Odpowiedź:
Należy użyć xhrFields
param of http://api.jquery.com/jQuery.ajax/
Przykład w dokumentacji to:
$.ajax({
url: a_cross_domain_url,
xhrFields: {
withCredentials: true
}
});
Ważne jest również, aby serwer odpowiedział poprawnie na to żądanie. Kopiowanie tutaj świetne komentarze od @ Frédéric i @Pebbl:
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: *
Więc gdy żądanie jest:
Origin: http://foo.example
Cookie: pageAccess=2
Serwer powinien odpowiedzieć:
Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Credentials: true
[payload]
W Przeciwnym Razie ładunek nie zostanie zwrócony do skryptu. Zobacz: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-05 17:51:12
Użycie
xhrFields: { withCredentials:true }
Jako część mojego wywołania jQuery ajax było tylko częścią rozwiązania. Musiałem również zwrócić nagłówki w odpowiedzi opcji z mojego zasobu:
Access-Control-Allow-Origin : http://www.wombling.com
Access-Control-Allow-Credentials : true
Ważne było, aby tylko Jeden dozwolony "origin" znajdował się w nagłówku odpowiedzi wywołania opcji, a nie "*". Osiągnąłem to odczytując pochodzenie z wniosku i wpisując je z powrotem do odpowiedzi-prawdopodobnie omijając pierwotną przyczynę ograniczenia, ale w moim przypadek użycia bezpieczeństwo nie jest najważniejsze.
Pomyślałem, że warto wyraźnie wspomnieć o wymogu tylko jednego pochodzenia, ponieważ standard W3C pozwala na listę rozdzieloną spacjami-ale Chrome nie! http://www.w3.org/TR/cors/#access-control-allow-origin-response-header Uwaga bit "w praktyce".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-14 16:50:35
Umieść to w swojej funkcji init:
$.ajaxSetup({
xhrFields: {
withCredentials: true
}
});
To zadziała.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-22 11:20:31
Istnieje już wiele dobrych odpowiedzi na to pytanie, ale pomyślałem, że pomocne może być Wyjaśnienie przypadku, w którym można oczekiwać, że plik cookie sesji zostanie wysłany, ponieważ domena cookie pasuje, ale nie jest wysyłany, ponieważ żądanie AJAX jest dokonywane do innej subdomeny. W tym przypadku mam plik cookie przypisany do *. mydomain.com domeny, a ja chcę, aby została włączona do żądania AJAX do different.mydomain.com". domyślnie, plik cookie nie jest wysyłany. Aby rozwiązać ten problem, nie trzeba wyłączać protokołu HTTPONLY w pliku cookie sesji. Musisz tylko zrobić to, co zasugerował wombling ( https://stackoverflow.com/a/23660618/545223 ) i wykonaj następujące czynności.
1) Dodaj następujące do żądania ajax.
xhrFields: { withCredentials:true }
2) Dodaj następujące elementy do nagłówków odpowiedzi dla zasobów w różnych subdomenach.
Access-Control-Allow-Origin : http://original.mydomain.com
Access-Control-Allow-Credentials : true
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:34
Po wypróbowaniu innych rozwiązań i nadal nie doprowadzając go do działania, dowiedziałem się, na czym polega problem w moim przypadku. Zmieniłem contentType z "application / json" na "text / plain".
$.ajax(fullUrl, {
type: "GET",
contentType: "text/plain",
xhrFields: {
withCredentials: true
},
crossDomain: true
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-23 09:31:25
Miałem ten sam problem i wykonując kilka sprawdzeń mój skrypt po prostu nie dostawał pliku cookie sessionid.
Zorientowałem się patrząc na wartość pliku cookie sessionid w przeglądarce, że mój framework (Django) przekazuje plik cookie sessionid z domyślnym HttpOnly. Oznaczało to, że skrypty nie miały dostępu do wartości sessionid i dlatego nie przekazywały jej wraz z żądaniami. Trochę śmieszne, że HttpOnly byłaby wartością domyślną, gdy tak wiele rzeczy używa Ajax, który wymagałby ograniczenia dostępu.
Aby to naprawić zmieniłem ustawienie (SESSION_COOKIE_HTTPONLY=False), ale w innych przypadkach może to być flaga "HttpOnly" na ścieżce cookie
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-12 17:16:23
Jeśli rozwijasz się na localhost
lub porcie localhost, takim jak localhost:8080
, oprócz kroków opisanych w odpowiedziach powyżej, musisz również upewnić się, że nie przekazujesz wartości domeny w nagłówku Set-Cookie.
Nie można ustawić domeny na localhost
w nagłówku Set-Cookie - to niepoprawne-po prostu pomiń domenę.
Zobacz Pliki cookie na localhost z wyraźną domeną i dlaczego nie asp.net tworzenie plików cookie w localhost?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:03
Tylko moje 2 centy na ustawienie pliku cookie PHPSESSID, gdy na localhost i pod dev environment. Wykonuję wywołanie AJAX do punktu końcowego REST API na locahost. Powiedzmy, że jego adres to mysite.localhost/api/member/login/
(virtal host w moim środowisku dev).
Kiedy wykonuję tę prośbę na Postmanie , wszystko idzie dobrze i PHPSESSID jest ustawiony z odpowiedzią.
Kiedy żądam tego punktu końcowego poprzez AJAX ze strony Browsersync proxy (np. z
122.133.1.110:3000/test/api/login.php
w linii adresu przeglądarki, zobacz domena jest inna niżmysite.localhost
) PHPSESSID nie pojawia się wśród plików cookie.Kiedy wykonuję to żądanie bezpośrednio ze strony w tej samej domenie (tj.
mysite.localhost/test/api/login.php
) PHPSESSID jest ustawiony w sam raz.
Więc jest to problem z zapytaniem o pochodzenie, jak wspomniano w odpowiedzi @flu powyżej
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-15 09:32:48
Dodanie mojego scenariusza i rozwiązania na wypadek, gdyby pomogło to komuś innemu. Podobny przypadek napotkałem podczas korzystania z interfejsów API RESTful. Mój serwer WWW hosting plików HTML / Script / CSS i serwer aplikacji exposing API były hostowane na tej samej domenie. Jednak ścieżka była inna.
Web server-mydomain / webpages / abc.html
Używane abc.js który ustawia plik cookie o nazwie mycookie
Serwer aplikacji - mydomain / webapis / nazwa usługi.
Do którego wywołania api zostały wykonane
Spodziewałem się pliku cookie w mydomain / webapis/servicename i próbowałem go odczytać, ale nie został wysłany. Po przeczytaniu komentarza z odpowiedzi sprawdziłem w narzędziu programistycznym przeglądarki, że mycookie 's path został ustawiony na" / webpages " i dlatego nie jest dostępny w wywołaniu usługi do
Mydomain / webapis / nazwa usługi
Więc podczas ustawiania cookie z jquery, to is what I did -
$.cookie("mycookie","mayvalue",{**path:'/'**});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-10 14:36:02
Być może nie w 100% odpowiadając na pytanie, ale natknąłem się na ten wątek w nadziei rozwiązania problemu sesji podczas ajax-wysyłanie plików z assetmanager edytora innovastudio. Ostatecznie rozwiązanie było proste: mają Flash-uploader. Disabling that (setting
var flashUpload = false;
In asset.php) i światła znów zaczęły migać.
Ponieważ problemy te mogą być bardzo trudne do debugowania odkryłem, że umieszczenie czegoś takiego jak poniżej w programie obsługi przesyłania postawi cię (no, mnie w tym przypadku) na właściwej ścieżce:
$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");
Zanurkowałem w dzienniku i szybko zauważyłem brakującą sesję, do której nie wysłano ciasteczek.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-04 22:05:54