Expiration of cookie not working, is this wrong?
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, whic开发者_开发知识库h is not what it should do (1 year from now).
Is the code wrong?
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.
精彩评论