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:
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:
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:
Mec (tte), il y a des incohérences et un bug dans votre configurateur de cookies.
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.
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.
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.
archivez Chrome console -> Resources
si votre page est chargée deux fois. Ce serait la raison du double cookie.
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.
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.