web-dev-qa-db-fra.com

Cookie est mis deux fois; Comment supprimer le duplicata?

J'ai donc un site Web qui utilise un cookie pour mémoriser l'état actuel de la mise en page d'une visite à l'autre. Tout fonctionnait bien jusqu'à ce que j'ajoute sur le site un bouton "J'aime" de la part de Facebook, qui génère des liens permettant aux utilisateurs de partager un certain état d'interface utilisateur (un peu déroutant mais pas vraiment pertinent au problème).

Le problème est que, lorsque je visite le site via l'un de ces liens Facebook, une deuxième copie de mon cookie de mise en page semble être créée (comme dans, je vois deux cookies avec le même nom et des valeurs différentes). Cela ne serait pas trop grave si ce n’est que la valeur du cookie en double semble bloquée, associée au fait que, lorsque l’utilisateur revient sur le site, le navigateur se souvient de la valeur bloquée au lieu de la valeur la plus récente ( comme s'il y avait un "bon" cookie avec lequel je peux toujours travailler, et un "mauvais" que je ne peux pas, et le navigateur aime se souvenir du "mauvais" cookie au lieu du "bon" cookie). Cela rompt la fonctionnalité de suivi de ma mise en page/de mémorisation.

Donc, il y a deux questions ici:

  1. Comment puis-je empêcher que cela se produise/pourquoi cela se produit-il en premier lieu?
  2. Comment puis-je résoudre le problème pour les utilisateurs qui ont déjà un cookie bloqué (je sais que je pourrais simplement choisir un nouveau nom pour le cookie, mais je le ferais plutôt en trouvant un moyen de décoller correctement le cookie bloqué)?

Si j'utilise la console pour développeurs de Chrome après avoir visité la page bloquée, je peux constater que document.cookie est (mise en forme ajoutée pour la lisibilité):

layoutState=[{'id':6,'x':8,'y':1525,'z':4,'url':'undefined'}, {'id':1,'x':625,'y':709,'z':2,'url':'undefined'}, {'id':2,'x':8,'y':37,'z':3,'url':'undefined'}, {'id':3,'x':625,'y':1179,'z':5,'url':'undefined'}, {'id':4,'x':626,'y':37,'z':1,'url':'undefined'}, {'id':5,'x':626,'y':357,'z':1000000,'url':'http://m.xkcd.com/303/'}]; 
WibiyaNotification1=1; 
WibiyaNotification213286=213286; 
WibiyaNotification213289=213289; wibiya756904_unique_user=1; 
JSESSIONID=DONTHIJACKMEPLEASE; 
WibiyaProfile={"toolbar":{"stat":"Max"},"apps":{"openApps":{}},"connectUserNetworks":[null,null,null,null,null,null]}; 
WibiyaLoads=59; 
layoutState=[{'id':6,'x':8,'y':1525,'z':4,'url':'undefined'}, {'id':1,'x':625,'y':709,'z':2,'url':'undefined'}, {'id':2,'x':8,'y':37,'z':3,'url':'undefined'}, {'id':3,'x':625,'y':1179,'z':5,'url':'undefined'}, {'id':4,'x':626,'y':37,'z':1,'url':'undefined'}, {'id':5,'x':626,'y':357,'z':6,'url':'http://m.xkcd.com/303/'}]"

Ignorez les cookies Wibiya et le JSESSIONID. Le cookie bloqué est la première instance de 'layoutState', et celle que je peux encore manipuler en JavaScript est la deuxième instance de 'layoutState'. Voici ce que je reçois si je change certaines choses:

layoutState=[{'id':6,'x':8,'y':1525,'z':4,'url':'undefined'}, {'id':1,'x':625,'y':709,'z':2,'url':'undefined'}, {'id':2,'x':8,'y':37,'z':3,'url':'undefined'}, {'id':3,'x':625,'y':1179,'z':5,'url':'undefined'}, {'id':4,'x':626,'y':37,'z':1,'url':'undefined'}, {'id':5,'x':626,'y':357,'z':1000000,'url':'http://m.xkcd.com/303/'}]; 
WibiyaNotification1=1;
WibiyaNotification213286=213286; 
WibiyaNotification213289=213289; 
wibiya756904_unique_user=1; 
JSESSIONID=DONTHIJACKMEPLEASE; 
WibiyaProfile={"toolbar":{"stat":"Max"},"apps":{"openApps":{}},"connectUserNetworks":[null,null,null,null,null,null]}; 
WibiyaLoads=59; 
layoutState=[{'id':1,'x':8,'y':39,'z':1000000,'url':'undefined'}]

Le second 'layoutState' contient les informations correctes que je veux que le navigateur retienne. Cependant, ce que le navigateur se souvient réellement est la valeur de la première instance.

J'ai essayé de supprimer complètement le cookie, ce qui entraîne la disparition de la deuxième instance, mais rien de ce que je fais ne semble supprimer la première instance. J'ai le même comportement dans tous les principaux navigateurs (Chrome, Firefox, IE), ce qui me laisse penser que je dois faire quelque chose de fondamentalement faux ici, mais je ne suis pas sûr de ce que c'est.

Vous pouvez voir le site lui-même ici . Ou cliquez ici _ pour y accéder via un lien Facebook (devrait générer un cookie bloqué). Toute aide est très appréciée.

Mise à jour:

Les étapes pour reproduire l'erreur de manière fiable sont les suivantes:

  1. Visitez le site via le lien de style Facebook
  2. Apportez des modifications à la disposition, puis fermez l'onglet.
  3. Visitez le site via le URL normale _.
  4. Votre mise en page de la visite initiale doit être correctement mémorisée. Modifiez donc certaines choses, puis actualisez la page. Lorsque la page sera rechargée, vos modifications ne seront plus mémorisées.

J'ai également remarqué que la consultation du site via l'URL de type Facebook permet d'effacer/de réinitialiser le cookie bloqué. Donc, c'est comme si le navigateur gardait un cookie séparé pour chaque chemin d'URL, ou quelque chose d'autre, et n'autorisait pas la page racine à accéder au cookie défini sur l'autre chemin d'URL. Je pensais pouvoir résoudre ce problème en définissant explicitement path=/ sur le cookie, mais pas de dés.

Mise à jour 2:

J'ai constaté que si je définissais le chemin et le domaine du cookie, mon comportement était différent dans tous les navigateurs:

  1. Firefox - Fonctionne correctement maintenant, hourra! Travaillé correctement une fois, puis cassé, boo!
  2. Chrome - Pas de changement
  3. IE - Il semble que les cookies soient conservés séparément pour chaque URL. L'URL de style Facebook enregistre un état et l'URL standard enregistre un autre. Les deux mises à jour correctement et indépendamment les uns des autres. C'est un peu génial, mais bien meilleur que l'état bloqué/brisé.
20
aroth

Mec (tte), il y a des incohérences et un bug dans votre configurateur de cookies.

1. Assurez-vous que le chemin et le domaine sont correctement définis

Le chemin d'accès et le domaine doivent être identiques pour effacer le cookie et le définir. Voir votre code ici:

document.cookie = c_name + "=; expires=Fri, 31 Dec 1999 23:59:59 GMT;";

et le comparer à:

var c_value=escape(value) + "; expires=" + exdate.toUTCString(); + "; path=/spring; domain=aroth.no-ip.org";

vous verrez que le passeur a les deux, mais pas le déléteur. Vous apporterez le chaos.

2. Oh, et ce méchant point-virgule

Cette deuxième ligne de code que j'ai citée ci-dessus a un point-virgule introduit au milieu d'une expression de concaténation de chaîne. Juste après exdate.toUTCString(). Tue le. Tuez-le… maintenant.

Au moins sur Google Chrome, j’ai réussi à le faire fonctionner correctement si je définissais un point d’arrêt sur json = "[" + json + "]"; et que je modifiais setCookie avant son exécution.

P/S: Ce fut une expérience de débogage bizarre, où j'ai réussi à configurer 4 cookies layoutState en bidouillant chemin et domaine.

24
syockit

C'est peut-être trop simple, mais au cas où, les cookies sont-ils enregistrés pour deux chemins différents? Si l'URL est différente, vous pouvez configurer vos cookies pour un chemin d'accès restreint, afin que le système les accepte différemment.

3
boisvert

archivez Chrome console -> Resources si votre page est chargée deux fois. Ce serait la raison du double cookie. 

1
Dmitriy Naumov

Il reste encore le problème après avoir identifié le problème et pris les mesures préventives en définissant correctement le cookie.
Vous devez également supprimer les cookies précédemment configurés de manière incorrecte dans votre navigateur ou dans le navigateur de votre client.

Observez donc le cookie des outils de développement, recherchez le chemin et le sous-domaine et mettez-les explicitement dans votre code à supprimer.

function eraseCookie(c_name) {
   document.cookie = c_name + "=; expires=Fri, 31 Dec 1999 23:59:59 GMT;";  

}

function eraseCookieWithPathDomain(c_name) {
       document.cookie = c_name + "=; expires=Fri, 31 Dec 1999 23:59:59 GMT;path=/yourpath/to; domain=sub.domain.com";
       //you can remove this function call on your second upload if you are confirm that the previous cookie setter expired
}

Vous devrez peut-être appeler la fonction eraseCookieWithPathDomain juste après eraseCookie ou même à chaque fois après le chargement du document, en fonction de votre application.

0
vusan

Il semble que le problème ne soit pas un cookie en double (les cookies s’écrasent eux-mêmes) mais une duplication des DONNÉES contenues dans votre cookie.

Je pense que vous devrez modifier le script qui lit le cookie et effacer la valeur dupliquée si elle est détectée.