Expiration of cookie not working, is this wrong?

2019-07-10 08:56发布

So I am using this code to drop a cookie, and having the page redirect if it has already been visited:

    <script language="JavaScript"><!--
function Get_Cookie(name) {
    var start = document.cookie.indexOf(name+"=");
    var len = start+name.length+1;
    if ((!start) && (name != document.cookie.substring(0,name.length))) return null;
    if (start == -1) return null;
    var end = document.cookie.indexOf(";",len);
    if (end == -1) end = document.cookie.length;
    return unescape(document.cookie.substring(len,end));
}

function Set_Cookie(name,value,expires,path,domain,secure) {
    document.cookie = name + "=" +escape(value) +
        ( (expires) ? ";expires=" + expires.toGMTString() : "") +
        ( (path) ? ";path=" + path : "") + 
        ( (domain) ? ";domain=" + domain : "") +
        ( (secure) ? ";secure" : "");
}

function Delete_Cookie(name,path,domain) {
    if (Get_Cookie(name)) document.cookie = name + "=" +
        ( (path) ? ";path=" + path : "") +
        ( (domain) ? ";domain=" + domain : "") +
        ";expires=Thu, 01-Jan-1970 00:00:01 GMT";
}

var mainUrl = 'noflash.html';
var days = 365; // valid one year from now

function isCookieEnabled() {
   if (document.all) return navigator.cookieEnabled;
   Set_Cookie('testcookie',today.getTime());
   var tc = Get_Cookie('testcookie');
   Delete_Cookie('testcookie');
   return (tc == today.getTime());
}

var today = new Date();
var zero_date = new Date(0,0,0);
today.setTime(today.getTime() - zero_date.getTime());

var todays_date = new Date(today.getYear(),today.getMonth(),today.getDate(),0,0,0);
var expires_date = new Date(todays_date.getTime() + (days * 86400000));

var beenHere = Get_Cookie('beenHere');
if (beenHere == 'yes') {
   if (document.images) window.location.replace(mainUrl);
   else window.location = mainUrl;
}
else if (isCookieEnabled()) Set_Cookie('beenHere','yes', expires_date);
//--></script>

It works fine, I checked the cookies, and it is created, and after visiting the page once, I get redirected, but the problem is the expiration, it says is when the browser is closed, which is not what it should do (1 year from now).

Is the code wrong?

1条回答
闹够了就滚
2楼-- · 2019-07-10 09:48

The ".toGMTString()" function does not give date strings in the format required for the cookie syntax. Your hard-coded date for the "delete" function is correct, but try

alert(new Date().toGMTString())

and see what you get - no dashes between the date parts.

Other not-relevant notes: you don't need a "language" attribute on your <script> tag, and nor do you need the antiquated HTML comment around the script body; that stopped being necessary about 12 years ago.

edit — to be a little more helpful, to get a cookie-friendly date I'd probably just put the string together myself.

function cookieDate(d) {
  function d2(n) { return n < 10 ? '0' + n : n; }
  var days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
    months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];

  return '' +
    days[d.getUTCDay()] + ', ' +
    d2(d.getUTCDate()) + '-' +
    months[d.getUTCMonth()] + '-' +
    d.getUTCFullYear() + ' ' +
    d2(d.getUTCHours()) + ':' +
    d2(d.getUTCMinutes()) + ':' +
    d2(d.getUTCSeconds()) + ' GMT';
}

Then you can just call "cookieDate(someDate)" to get a nice string.

Here's the jsfiddle.

查看更多
登录 后发表回答