Le cookie est réglé deux fois; Comment supprimer le double?

J'ai donc un site Web qui utilise un cookie pour se souvenir de l'état actuel de la mise en page dans les visites. Tout fonctionnait bien jusqu'à ce que j'ajoute un bouton 'Like' de Facebook au site qui génère des liens qui permettent aux utilisateurs de partager un certain état de l'interface utilisateur (un peu confus mais pas vraiment pertinent pour le 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 le cas, je vois deux cookies avec le même nom et des valeurs différentes). Cela ne serait pas trop terrible, sauf que la valeur du cookie en double semble être bloquée, couplée au fait que lorsque l'utilisateur retourne au site, le navigateur se souvient de la valeur bloquée au lieu de la valeur définie la plus récente (donc c'est un peu Comme s'il y a un «bon» cookie avec lequel je peux encore travailler et un «mauvais» que je ne peux pas, et que le navigateur aime se souvenir du «mauvais» cookie au lieu du «bon» cookie). Cela brise mes fonctionnalités de suivi / rappel de mise en page.

Il y a donc deux questions ici:

  1. Comment puis-je empêcher que cela ne se produise / pourquoi cela se passe-t-il en premier lieu?
  2. Comment réparer les choses 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 préfère le faire en trouvant un moyen de décocher correctement le cookie collé)?

Si j'utilise la console de développeur de Chrome après avoir visité la page dans un état bloqué, je peux voir que document.cookie est (formatage ajouté 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 coincé est la première instance 'layoutState', et celle que je peux encore manipuler en JavaScript est la deuxième instance 'layoutState'. Voici ce que je reçois si je change quelque chose:

 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 deuxième 'layoutState' contient les informations correctes que je souhaite que le navigateur se souvienne. Cependant, ce que le navigateur se souvient réellement, c'est la valeur de la première instance.

J'ai essayé de déranger complètement le cookie, ce qui fait disparaître la deuxième instance, mais rien que je fais semble se débarrasser de la première instance. J'ai le même comportement dans tous les principaux navigateurs (Chrome, Firefox, IE), ce qui me fait soupçonner que je dois faire quelque chose de fondamentalement mal 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 l'accéder via un lien Facebook (devrait générer un cookie collé). Toute aide est très appréciée.

Mettre à jour:

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

  1. Visitez le site via le lien de style Facebook
  2. Effectuez des modifications à la mise en page, puis fermez l'onglet.
  3. Visitez le site via l' URL normale .
  4. Votre mise en page à partir de la visite initiale devrait être correctement rappelée, afin de modifier certaines choses et ensuite actualiser la page. Lorsque la page se recharge, vos modifications ne seront plus rappelées.

J'ai également remarqué que revisiter le site via l'URL de style Facebook est capable de nettoyer / réinitialiser le cookie bloqué. C'est comme si le navigateur gardait un cookie distinct pour chaque chemin d'URL, ou quelque chose, et ne permettait pas à la page racine d'accéder au cookie qui était défini sur l'autre chemin d'URL. Je pensais pouvoir réparer ceci en définissant explicitement le path=/ sur le cookie, mais pas de dés.

Mise à jour 2:

J'ai trouvé que si je définissais le chemin d'accès et le domaine du cookie, j'ai un comportement différent dans tous les navigateurs:

  1. Firefox – Fonctionne correctement maintenant, voilà! A travaillé correctement une fois, puis cassé, bêtise!
  2. Chrome – Aucun changement
  3. IE – Il semble conserver des cookies distincts pour chaque URL, de sorte que l'URL de style Facebook se rappelle d'un état et l'URL standard se souvient d'un état différent. Les deux sont mis à jour correctement et indépendamment l'un de l'autre. C'est génial, mais toujours mieux que l'état bloqué / brisé.

Dude (tte), il y a des incohérences et un bug dans votre robot.

1. Assurez-vous que le chemin d'accès et le domaine sont correctement configurés

Le chemin d'accès et le domaine doivent être identiques pour le nettoyage du cookie et le réglage. Consultez votre code ici:

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

Et comparez-le à:

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

Vous verrez que le setter a les deux, mais le deleter ne l'est pas. Vous provoquerez un chaos.

2. Oh, et ce quiropol méchant

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 mon Google Chrome, j'ai réussi à le faire fonctionner correctement, si je définis un point d'arrêt à json = "[" + json + "]"; Et modifiez setCookie avant qu'il ne soit exécuté.

P / S: il s'agissait d'une expérience de débogage bizzare, où j'ai réussi à configurer 4 cookies layoutState , en layoutState chemin d'accès et le domaine.

Cela 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 définir vos cookies pour un chemin restreint, de sorte que le système les prendrait différemment.

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

Il semble que le problème n'est pas un cookie en double (les cookies s'écrasent eux-mêmes), mais une duplication des DATA dans votre cookie.

Je pense que vous devrez modifier le script qui lit le cookie et nettoyer la valeur dupliquée s'il est détecté.

Il reste encore le problème après avoir identifié le problème et pris la prévention en configurant correctement le cookie.
Vous devez également supprimer les cookies précédemment configurés incorrectement dans votre navigateur ou dans votre navigateur.

Observez donc le jeu de cookies à partir des outils du développeur et recherchez le chemin et le sous-domaine et mettez-les explicitement sur 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 l' eraseCookie de eraseCookie ou même chaque fois que le chargement du document dépend de votre application.