HTML
Børre Stenseth
Data i sandkassa >Cookies

Cookies

Hva

Cookies er måten vi tradisjonelt har brukt til "sette spor" på en webside. cookie-mekanismen er implementert på klienten som: document.cookie

Format

En cookie har følgende felt.

name=value
Vi idetifiserer en cookie med name som nøkkel
domain
Hvilket domene cookien skal settes for
path
Hvilket katalog som skal sette cookien
expires
Hvilken dato cookien skal slettes
secure
Hvis denne verdien er satt til secure, vil cookien bare kunne hentes med en secure server.

Vi setter opp en ny cookie med følgende document.cookie="<en string som beskriver en ny cookie>".

Formatet er slik:
name=value[; expires=date][; domain=domain][; path=path][; secure]

Altså kan vi skrive f.eks.:

 document.cookie='name=borres was here; expires=Sat, 17 May 2014 21:15:15 GMT';

Av feltene over er det i prinsipp bare name=value som må settes. Alle feltene er lagret som en string der hver verdi er separaret med semikolon.

Dersom vi vil endre en cookie, må vi sette den med samme navn og med nye verdier. F.eks. kan vi slette en cookie med å sette expires til en dato før dagens dato, eller hvis vi setter en verdi uten expires så vil den slettes når sesjonen er over (nettleseren avslutter).

Et kall på document.cookie vil returnere en string med alle cookies i en semikolon-separerte liste av "name=value"-par. Det er bare navnet og verdien som er tilgjengelig. De andre feltene kan ikke hentes med javaScript.

JS-bibliotek

Det er laget en rekke mer eller mindre avanserte biblioteker for å sette/lese/fjerne cookies.

Følgende er en lett modifisert utgave av et forslag fra Quirksmode.org [1] .

_cooklib.js

Dette, som de fleste andre bibliotekene har fokus på name=value og expire. Andre egenskaper som domain og secure kan lett settes ved å justere makeCookie.

(linjeskift lagt til for lesbarhet)



Server

Når en nettleserside tar kontakt med server via HTTP, sendes cookie informasjon som en del av HTTP-headeren. Denne informasjonen sendes bådes om en del av en vanlig HTTP-request og som en del av en AJAX-request (XMLHttpRequest). Vi skal se litt på hvordan denne informasjonen kan handteres i python.

Eksempel 1

Vi lager et enkelt eksempel der vi ber Python sette en cookie som forteller hvilken Python-versjon som kjører. Vi gjør dette med en AJAX-request. Merk da at vi ikke setter cookien i javascriptet. Den settes i headeren på det vi får tilbake fra serveren (pythonskriptet).

function getNewCookie(targetNodeId){
$.ajax({
    url:'simplySetCookie.py',
    success:function(data)
    {
        $('#'+targetNodeId).html(data);
    },
    error:function(data)
    {
        $('#'+targetNodeId).html('error');
    }
    });    
}

og Python skriptet er slik:

#! /usr/bin/python
import sys
import Cookie
"""
How to make a cookie and return it
The cookie set the actual python-version,
but you can do anything according to this patetrn
"""
c = Cookie.SimpleCookie()     # New cookieset
c["python"] = sys.version     # New cookie with python=version
c["python"]["max-age"] = 3600 # Browser drops cookie after 1 hour
cookieText = c.output()       # Cookieset to text
print "Content-type: text/plain"
print cookieText              # Cookie-settet sent
print ""
print "Hello. Your browser has received a cookie."

test det:

 

Eksempel 2

Vi snur problemstillingen og lager et pythonskript som leser cookies fra den requesten som sendes.

function getAllCookies(targetNodeId){
$.ajax({
    url:'pycookdump.py',
    success:function(data)
    {
        $('#'+targetNodeId).html(unescape(data));
    },
    error:function(data)
    {
        $('#'+targetNodeId).html('error');
    }
    });    
}

og Python skriptet er slik:

#! /usr/bin/python
import cgitb, cgi, Cookie, os
cgitb.enable()
"""
Read all cookies received and return result as a HTML-fragement
"""
def getDescription(cook):
    # values, not set command
    T=cook.output().split(':')[1]
    return T
S=""
c = Cookie.SimpleCookie()
try:
    clientCookieText = os.environ["HTTP_COOKIE"]
    c.load(clientCookieText) #load cookies
    keys=c.keys()
    for k in keys:
        S+=getDescription(c[k])+'\n'#S+c[k].output()+'\n'
except:
    res=sys.exc_info()
    S= res[1]

#------------
#return header and htmlreport
print "Content-type: text/html\n"
print """
<pre>
%s
</pre>
"""%S

test det:

 
[2] [3]
Referanser
  1. Quirksmode Peter-Paul Koch Quirksmode.org www.quirksmode.org/ 14-03-2010
  1. HTTP cookies explained Nicholas C. Zakas NCZOnline www.nczonline.net/blog/2009/05/05/http-cookies-explained/ 14-03-2014
  1. HTTP cookie Wikipedia en.wikipedia.org/wiki/HTTP_cookie 14-03-2014
Data i sandkassa >Cookies