Cookie is set twice; how to remove the duplicate?

49,909

Solution 1

Dude(tte), there are inconsistencies, and a bug, in your cookie setter.

1. Make sure path and domain is correctly set

The path and domain should be the same for both clearing the cookie and setting it. See your code here:

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

and compare it to:

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

you will see that the setter has both of them, but the deleter doesn't. You will bring about chaos.

2. Oh, and that nasty semicolon

That second line of code I quoted above, has a semicolon introduced in the middle of a string concatenation expression. Right after exdate.toUTCString(). Kill it. Kill it…now.

At least on my Google Chrome, I managed to get it run correctly, if I set a breakpoint at json = "[" + json + "]"; and modify setCookie before it is executed.

P/S: It was a bizzare debugging experience, where I managed to set 4 layoutState cookies, by fiddling with path & domain.

Solution 2

This may be too simple, but just in case, are the cookies recorded for two different paths? If the URL is different, you may be setting your cookies for a restricted path, so the system would take them differently.

Solution 3

There is again the problem left after identifying the problem and taking prevention by correctly setting the cookie.
You also need to delete previous incorrectly set cookies in your or in your client's browser.

So observe the cookie set from developer tools and search for path and subdomain and put those explicitly on your code to delete.

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
}

You may need to call function eraseCookieWithPathDomain right after eraseCookie or even every time after document load depending in your application.

Solution 4

Here is a solution, the / slash help to do not set duplicate cookie of same name

setcookie('YourCookieName','yes', time() + 400, '/');

Solution 5

check in Chrome console -> Resources if your page gets loaded twice. That would be the reason of double cookie.

Share:
49,909

Related videos on Youtube

aroth
Author by

aroth

Open-source contributions include matchbook, a platform-agnostic matchmaking service, API, and SDK for mobile applications (think multi-platform real-time gaming), a thread-safe wrapper for Apple's Core Data framework, and a screen-capture utility for iOS. See GitHub for more. Interested in AI, robotics, sustainable/renewable energy, and Internet-of-Things (IoT) applications. Feel free to get in touch if you have a project along those lines and need a capable technical resource to help make it a reality.

Updated on August 18, 2021

Comments

  • aroth
    aroth over 2 years

    So I have a website that uses a cookie to remember the current layout state across visits. Everything was working great until I added a Facebook 'Like' button to the site which generates links that allow users to share a certain UI state (a little confusing but not really relevant to the problem).

    The problem is that when I visit the site via one of these Facebook links a second copy of my layout cookie seems to be created (as in, I see two cookies with the same name and different values). This wouldn't be too terrible except that the value of the duplicate cookie appears to be stuck, coupled with the fact that when the user returns to the site the browser remembers the stuck value instead of the most recently set value (so it's kind of like there's a "good" cookie that I can still work with, and a "bad" one which I cannot, and the browser likes to remember the "bad" cookie instead of the "good" cookie). This breaks my layout tracking/remembering functionality.

    So there are two questions here:

    1. How do I stop this from happening/why is this happening in the first place?
    2. How do I fix things for any users that already have a stuck cookie (I know I could just pick a new name for the cookie, but I'd rather do it by finding a way to properly unstick the stuck cookie)?

    If I use Chrome's developer console after visiting the page in a stuck state, I can see that document.cookie is (formatting added for readability):

    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/'}]"
    

    Ignore the Wibiya cookies and the JSESSIONID. The stuck cookie is the first 'layoutState' instance, and the one that I can still manipulate in JavaScript is the second 'layoutState' instance. Here is what I get if I change some things around:

    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'}]
    

    The second 'layoutState' has the correct information that I want the browser to remember. However what the browser actually remembers is the value of the first instance.

    I've tried unsetting the cookie entirely, which causes the second instance to disappear, but nothing I do seems to get rid of the first instance. I get the same behavior in all major browsers (Chrome, Firefox, IE), which makes me suspect that I must be doing something fundamentally wrong here, but I'm not sure what it is.

    You can view the site itself here. Or click here to access it via a Facebook link (should generate a stuck cookie). Any help is much appreciated.

    Update:

    So the steps to reliably reproduce the error are as follows:

    1. Visit the site via the Facebook-style link
    2. Make some changes to the layout, and then close the tab.
    3. Visit the site via the normal URL.
    4. Your layout from the initial visit should be correctly remembered, so change some things around and then refresh the page. When the page reloads, your changes will no longer be remembered.

    I've also noticed that revisiting the site via the Facebook-style URL is able to clear/reset the stuck cookie. So it's like the browser is keeping a separate cookie for each URL path, or something, and not allowing the root page to access the cookie that was set on the other URL path. I thought I might be able to fix this by explicitly setting path=/ on the cookie, but no dice.

    Update 2:

    I've found that if I set both the path and the domain of the cookie I get different behavior in all browsers:

    1. Firefox - Works correctly now, hooray! Worked correctly once, then broke, boo!
    2. Chrome - No change
    3. IE - Seems to be keeping separate cookies for each URL, so the Facebook-style URL remembers one state, and the standard URL remembers a different state. Both update correctly and independently of each other. This is kind of funky, but still way better than the stuck/broken state.
  • aroth
    aroth about 13 years
    I tried that, I can indeed detect when the duplicate data is present in the cookie. But how do you suggest I clean it out? Obvious solutions such as using a regex to replace the data do not seem to work.
  • aroth
    aroth about 13 years
    I'm setting the path on the cookie to the same thing in both cases (have tried both / and /spring). In terms of the path of the page which sets the cookie, the only different between the two cases is some extra GET parameters.
  • aroth
    aroth about 13 years
    Thanks, I can't believe I missed a bug as big as that in all the time I spent trying to get this code to work correctly. I'm also a little surprised that the code didn't raise any errors in that state. If var c_value=escape(value) + "; expires=" + exdate.toUTCString(); is a statement, then the next statement is + "; path=/spring; domain=aroth.no-ip.org";. How is that valid JavaScript, and what does it do when it executes? In any case, I fixed those issues and now everything seems good, apart from cleaning up already broken sessions.
  • syockit
    syockit about 13 years
    @aroth there is something known as unary +. See xkr.us/articles/javascript/unary-add. And here, I thought there was only unary -, which I thought was applicable to numbers only, but in reality also has the same effect as above.
  • Chirag Ravindra
    Chirag Ravindra over 7 years
    Thanks for clearing that up. Any ideas on the other part of the question: How do we de-dupe the cookies for users who are already stuck with the duplicated cookie?
  • Chirag Ravindra
    Chirag Ravindra over 7 years
    Found this which helped me de-dupe it: stackoverflow.com/questions/2959010/…

Related