Articles | Intelligent Cookies
| back
Introduction
Have you ever come across a web site, that refuses to
accept the fact that you don't take cookies? This article will describe how to utilize
cookies in your web site without forcing cookies on your visitors.
We can then use cookies, if the visitor permits, to
track the visitor through the site, without the danger of upsetting the visitor.
Cookies
Rightly or wrongly people are wary of cookies, and as a
result they sometimes set the options on their browser to warn them if a site
attempts to write a cookie. The user can then decide whether to allow the site
to write the cookie or not. However badly written scripts could still attempt to
write the same cookie or other further cookies without realizing that the
visitor doesn't want them. If this goes on for too long then the visitor may
leave - disaster!
The browser can warn if a cookie is being written,
however it remains silent if the cookie is being read. It is this facility that
will be used to create Intelligent Cookies.
Normally when writing a cookie - all that is done is
the writing of the cookie. If we were to check to see if the cookie had actually
been written then we would know whether the visitor is accepting cookies. Before
writing the next cookie, we should check that the last cookie was written
successfully. If it wasn't then we shouldn't write the next one.
Rather than use JavaScript variables to work out
whether the last cookie was written or not, we'll use a Master Cookie itself as
an indication of whether or not any further cookies should be written.
If the visitor accepts the first few cookies, but then
stops accepting them, for whatever reason, then we should realize this and stop
the writing of any further cookies. In this instance we need to delete the
Master Cookie. This will then indicate that no further cookies are acceptable.
Note: it is possible that the visitor could deny this as well.
The following psuedo code explains the mechanism:
store Master Cookie
get Master Cookie
if Master Cookie does not exist
set Master Cookie
store Intelligent Cookie
get Master Cookie
if Master Cookie
get Intelligent Cookie
if Intelligent Cookie does not exist or its value is different
set Intelligent Cookie
get Intelligent Cookie
if Intelligent Cookie does not exist or its value is different
delete Master Cookie
|
The store Master Cookie code only needs to be invoked
from the sites Home Page, i.e. when the visitor arrives. The store Intelligent
Cookie code can be invoked any time an Intelligent Cookie needs to be stored.
The Master Cookie will be stored without an expiry
date, which means that once the visitors current browser session has finished
the cookie will disappear. Next time the visitor comes by the Master Cookie will
be stored again. If the visitor refuses to accept cookies, then the worse
they'll receive is a request to store the Master Cookie each time they visit the
Home Page.
Get_Cookie(), Set_Cookie and Delete_Cookie()
The code Get_Cookie(), Set_Cookie()
and Delete_Cookie() is based on the public domain cookie code produced
by Bill Dortch.
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";
}
|
storeMasterCookie() and storeIntelligentCookie()
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() +
(8 * 7 * 86400000));
function storeMasterCookie() {
if (!Get_Cookie('MasterCookie'))
Set_Cookie('MasterCookie','MasterCookie');
}
function storeIntelligentCookie(name,value) {
if (Get_Cookie('MasterCookie')) {
var IntelligentCookie = Get_Cookie(name);
if ((!IntelligentCookie) || (IntelligentCookie != value)) {
Set_Cookie(name,value,expires_date);
var IntelligentCookie = Get_Cookie(name);
if ((!IntelligentCookie) || (IntelligentCookie != value))
Delete_Cookie('MasterCookie');
}
}
}
|
The storeMasterCookie() and storeIntelligentCookie()
functions follow the psuedo code described earlier. They both make use of the Get_Cookie(),
Set_Cookie() and Delete_Cookie() functions. The initial date
manipulation is required to create an expiry date (set for 8 weeks into the
future) for the storing of the Intelligent Cookies.
JavaScript Source Files
The writing and testing of these Intelligent Cookies
can occur across many documents in a site. Rather than include the JavaScript
code in each and every document, we'll utilize JavaScript source files to hold
the JavaScript in a cookie.js file. These *.js files are supported in Netscape
Navigator 3 upwards and in Microsoft Internet Explorer from around 3.02 upwards.
For browsers that don't support *.js files then cookies will simply not be
written. If you cannot live with this then you'll need to include the code in
all of your pages that write cookies.
The contents of the cookie.js file would be as follows:
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-70 00:00:01 GMT";
}
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() + (8 * 7 * 86400000));
function storeMasterCookie() {
if (!Get_Cookie('MasterCookie'))
Set_Cookie('MasterCookie','MasterCookie');
}
function storeIntelligentCookie(name,value) {
if (Get_Cookie('MasterCookie')) {
var IntelligentCookie = Get_Cookie(name);
if ((!IntelligentCookie) || (IntelligentCookie != value)) {
Set_Cookie(name,value,expires_date);
var IntelligentCookie = Get_Cookie(name);
if ((!IntelligentCookie) || (IntelligentCookie != value))
Delete_Cookie('MasterCookie');
}
}
}
var src_loaded = true;
|
To embed the cookie.js file into a page use the
following:
<SCRIPT SRC="cookie.js"><!--
var src_loaded = false;
//--></SCRIPT>
|
To later create the Master Cookie:
<SCRIPT LANGUAGE="JavaScript"><!--
if (src_loaded) storeMasterCookie();
//--></SCRIPT>
|
To store an Intelligent Cookie:
<SCRIPT LANGUAGE="JavaScript"><!--
if (src_loaded) storeIntelligentCookie('test','cookie value');
//--></SCRIPT>
|
The src_loaded variable indicates whether the
cookie.js file was loaded by the browser or not.
Articles | Intelligent Cookies
|
back
|