Forleden dag sad jeg og skulle lave cookier med JavaScript, og jeg
opdagede et par interessante (eller rettere: deprimerende) ting:
1. Cookie-specifikationen (skrevet af Netscape, der opfandt ideen) er
fuld af fejl og selvmodsigelser. På
http://wp.netscape.com/newsref/std/cookie_spec.html kan man under
overskriften "expires=Date" læse, at udløbsdatoen skal formateres med et
fire-cifret år. I eksemplet længere nede er årstallet dog kun skrevet
med to cifre. Ugedagnavnet er skrevet med tre bogstaver, hvor det i
eksemplet nederst er skrevet fuldt ud. De selvmodsigelser har afledt
endnu mere forvirring på Netscapes andre sider, f.eks. siden om
document.cookie i JavaScript-specifikationen samt
http://developer.netscape.com/docs/manuals/js/client/jsref/cookies.htm#1002170.
Nuvel, jeg bilder mig ind, jeg har fundet det rigtige format for
udløbsdatoen, og det er:
Thursday, 29-Aug-02 13:28:00 GMT
Hele cookien kan så se således ud:
navn=vaerdi%20med%20mellemrum; path=/; expires=Thursday, 29-Aug-02
13:28:00 GMT
2. Når man ser på de eksempler på cookiebagning med JavaScript, der
findes på nettet, så bruger de stort set allesammen en forkert
formatering af datoen. De bruger funktionen toGMTString(), som ikke bare
er forældet i JavaScript 1.3, men også (ifølge Netscapes egen JavaScript
1.3-dokumentation) giver et forskelligt format alt efter hvilken
platform, man befinder sig på (alene dét gør funktionen ubrugelig til
cookier). I min Mozilla giver toGMTString() følgende format:
Thu, 29 Aug 2002 11:32:20 GMT
Det ligner lidt cookie-udløbsdatoformatet, men er bestemt ikke det
samme. Det betyder så, at man må bruge JavaScripts mildt sagt dårlige
datofunktioner til at lave en gyldig udløbsdato. Her er mit forslag til,
hvordan man med JavaScript 1.3 laver en gyldig cookie med udløbsdato om
et år:
maaneder = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
"Aug", "Sep", "Oct", "Nov", "Dec")
dage = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
"Friday", "Saturday")
dato = new Date()
dato.setUTCFullYear(dato.getUTCFullYear() + 1)
dag = dage[dato.getUTCDay()]
dagIMaaneden = dato.getUTCDate()
maaned = maaneder[dato.getUTCMonth()]
aar = String(dato.getUTCFullYear()).substr(-2)
time = dato.getUTCHours()
minut = dato.getUTCMinutes()
sekund = dato.getUTCSeconds()
if (dagIMaaneden < 10) dagIMaaneden = "0"+dagIMaaneden
if (time < 10) time = "0"+time
if (minut < 10) minut = "0"+minut
if (sekund < 10) sekund = "0"+sekund
udloebsdato = dag+", "+dagIMaaneden+"-"+maaned+"-"+aar+"
"+time+":"+minut+":"+sekund+" GMT"
document.cookie = "navn=vaerdi%20med%20mellemrum; path=/;
expires="+udloebsdato