Cookies
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] .
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: