jQuery getJSON n'envoie pas de cookies
je suis notamment JS sur domaine1 forme domain2
<script type="text/javascript" src="http://www.domain2.com/script.js"></script>
que le script ne onload et sur le bouton cliquez sur un JSONP demande de domaine2
$.getJSON( 'http://www.domain2.com/process?callback=?',
function(data){
if ( data ) processData( data );
}
);
puis en affichant les données sur domaine1.
Donc voici mon problème:
Le getJSON demande de ne pas envoyer des cookies à la domaine2.
Le plus étrange, c'est qu'il n'envoyer les cookies de la moitié d'un jour et pas l'autre moitié. 🙂
C'est la façon dont la demande ressemble quand il ne marche pas:
Request details
GET /ajax/embed-user-library?detail=98&callback=jsonp1312398534998 HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50
Host: www.floowie.com
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: en,sk-SK;q=0.9,sk;q=0.8
Accept-Encoding: gzip, deflate
Referer: http://www.sokker.cz/en/test2
Connection: Keep-Alive
Response details
HTTP/1.1 200 OK
Date: Wed, 03 Aug 2011 19:06:51 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.5-0.dotdeb.1
Set-Cookie: SESSID=64292b70dc28d7c6c9f13f70070353d8; path=/; domain=.floowie.com
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-cache, must-revalidate
Pragma: no-cache
Content-Length: 34
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: application/json
Et c'est quand il fonctionne(rien n'a changé dans les scripts):
Request details
GET /ajax/embed-user-library?detail=99&test=1&callback=jsonp1312398534999 HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50
Host: test1.floowie.com
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: en,sk-SK;q=0.9,sk;q=0.8
Accept-Encoding: gzip, deflate
Referer: http://www.sokker.cz/en/test2
Cookie: __utma=254918925.1489796832.1301725317.1312260335.1312298033.44; __utmz=254918925.1312298033.44.11.utmcsr=sokker.cz|utmccn=(referral)|utmcmd=referral|utmcct=/en/test2; lang=en; FLWSESSID=ddd1bc696f83f5a70b5f0f3ae30b4691; __utma=121955676.1030804516.1282595153.1312390656.1312397285.194; __utmb=121955676.8.10.1312397285; __utmc=121955676; __utmz=121955676.1312397285.194.21.utmcsr=floowie.crmserver.cz|utmccn=(referral)|utmcmd=referral|utmcct=/index.php
Connection: Keep-Alive
Response details
HTTP/1.1 200 OK
Date: Wed, 03 Aug 2011 19:07:45 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.5-0.dotdeb.1
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-cache, must-revalidate
Pragma: no-cache
Content-Length: 20
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: application/json
Quelqu'un de voir de tels comportements?
Est-il solvable?
Merci
source d'informationauteur BlueZero
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez utiliser AJAX pétitions sur différents domaines/sous-domaines que vous avez à mettre en oeuvre Origine de la Croix Demandes.
Références:
Exemples:
Votre serveur doit envoyer cette les en-têtes:
Vous pouvez retourner le Access-Control-Allow-Origin à l'échelle mondiale ou de définir plus précisément la charge de votre entrée Origine ($_SERVER['HTTP_ORIGIN']) en-tête de requête. S'appliquent également pour Access-Control-Allow-Méthodes.
Vous doit mettre en œuvre les OPTIONS pétition. Avant le premier appel AJAX, les navigateurs modernes appeler l'URL avec une méthode pour récupérer le au-dessus des en-têtes.
Ok c'est la première partie, la deuxième est avec jQuery. Lisez très attentivement cette page: http://api.jquery.com/jQuery.ajax/
Vous aurez besoin d'ajouter certaines options pour chaque appel AJAX, vous pouvez le faire à l'échelle mondiale:
Ou spécifiques:
Cette question m'a fait perdre de nombreux heures... j'espère que ça aide.
Notez que vous n'aurez pas besoin de régler votre cookie de domaine sous ".floowie.com" si vous le souhaitez.
Vous devez mettre en œuvre correctement la SCRO demandes avec des informations d'identification d'envoyer et de recevoir des cookies via Ajax. Voir developer.mozilla.orgplus précisément dans la section intitulée "Demandes avec des informations d'identification."
Tout d'abord, voici un exemple simple de la SCRO requête Ajax avec des informations d'identification, à l'aide de jQuery 1.5.1+:
Note le
withCredentials
drapeau dans le xhrFields. Ce drapeau indique au navigateur d'envoyer des cookies à la demande de la externe domaine, pas le origine domaine. Dans votre cas, les cookies pour http://www.domain2.com sera envoyé, et vous aurez accès à leur côté serveur.Sur le côté serveur, vous devez ajouter les en-têtes de la réponse:
Important: demandes avec des informations d'identification ne peut pas définir la Access-Control-Allow-Origin en-tête global (
Access-Control-Allow-Origin: *
). Elle doit préciser les domaines (Access-Control-Allow-Origin: www.domain1.com
).C'est évidemment mieux si vous spécifiez un domaine pour la Access-Control-Allow-Origin en-tête. Mais si vous ne savez pas ou de soins où les CORS demande, vous pouvez utiliser le
Origin
en-tête de la demande et de définir simplement la Access-Control-Allow-Origin en-tête de votre réponse. En C#, c'est la façon dont nous l'avons fait:Après avoir fait tout cela, les cookies que vous définissez côté serveur sera envoyé avec la réponse, et le navigateur sera en mesure de bien les gérer et de les insérer dans le navigateur de la banque de cookies pour http://www.domain2.com. Et toute la SCRO demandes que vous envoyez envoyer ces cookies dans la demande.
Si vous envoyez une demande autre que le GET, POST, HEAD ou des méthodes, vous aurez besoin de mettre en œuvre Contrôlé demande (voir la section intitulée "Contrôlé demandes"):
Côté-note sur IE8 et IE9:
L'appel Ajax ci-dessus échoue dans IE8 et 9. J'ai inclus le fichier JS de MoonScript/jQuery-ajaxTransport-XDomainRequest sur ma page, et ce automatiquement autorisé de la SCRO demande de travailler dans ces vieilles versions IE. Mais, malheureusement, la XDomainRequest objet que MS créé pour IE8 et 9 ne pas autoriser les cookies pour être envoyé ou reçu. (voir ce blog MSDN pour plus d'informations)
Vous avez des hôtes différents. Dans le premier exemple, l'hôte est "l'Hôte: http://www.floowie.com". Dans la seconde, c'est "l'Hôte: test1.floowie.com".
Je devine que les cookies sont initialement fixé par les 'test1.floowie.com" et vous n'avez pas spécifié qu'ils doivent être disponibles '.floowie.com' (c'est à dire l'ensemble du domaine et de tous les sous-domaines).
Pouvez-vous poster le code qui définit les cookies en premier lieu?
Si vous la résolution de ce problème, il faut au moins montrer la cohérence de comportement. Cependant, c'est à dire ne sera probablement pas encore transmettre des cookies à travers les sous-domaines. C'est ce que je suis le catch en ce moment, qui est de savoir comment je peux en travers de votre question.