Sei sulla pagina 1di 20

Servlet - 3

Cookie Sessioni Contesto dellapplicazione

Gestione dei cookie


! Una

classe Cookie per modellare i cookie


Ha metodi per accedere e impostare le propriet di ciascun cookie

! Metodi

HttpServletRequest per prelevare i cookie eventualmente associati alla richiesta ! Metodi di HttpServletResponse per inserire cookie nella risposta
Tecnologie di Sviluppo per il Web 2

di

I cookie 1
! !

Costruttore
Cookie(String nome, String val)

Metodi
public void setName(String cookieName) public String getName() public void setValue(String cookieValue) public String getValue() public void setDomain(String domain) public String getDomain()
Tecnologie di Sviluppo per il Web 3

I cookie 2
public void setMaxAge(int lifetime) public int getMaxAge() void setPath(String uri) String getPath() void setSecure(boolean flag) boolean getSecure() void setComment(String purpose) String getComment()
Tecnologie di Sviluppo per il Web 4

Passi per creare un cookie


! Sono

necessari tre passi:

Creare un nuovo oggetto Cookie


Cookie cookie = new Cookie (name, value);

Settare gli attributi del Cookie


cookie.setMaxAge(60);

Aggiungere il cookie alla risposta


response.addCookie(cookie)

Tecnologie di Sviluppo per il Web

Costruire un cookie
!

Si pu creare un nuovo cookie invocando il costruttore della classe Cookie specificando:


Nome Valore

Il nome ed contenere:

il

valore

non

dovrebbero

Spazi bianchi []()=,/?@;


Tecnologie di Sviluppo per il Web 6

Settare gli attributi di un cookie


! Prima

di aggiungere il cookie alla risposta, bisogna settare i suoi attributi ! Tra gli attributi dei cookie ricordiamo:
Nome e Valore Dominio Et Massima Path
Tecnologie di Sviluppo per il Web 7

Nome e valore di un cookie


! Si

utilizzano i metodi

public void setName(String cookieName) public String getName() public void setValue(String cookieValue) public String getValue()
! In

generale i metodi setName e setValue non si utilizzano, ma tali valori sono settati utilizzando il costruttore
Tecnologie di Sviluppo per il Web 8

Dominio di un cookie
!

Il browser restituisce il cookie solo ed esclusivamente allo stesso host che lo ha inviato.
public String getDomain(); public void setDomain(String domain);

Si pu usare setDomain() per fare in modo che il cookie venga restituito a tutti gli host del dominio
cookie.setDomain (".unisa.it"); Sono necessari i due punti
Tecnologie di Sviluppo per il Web 9

Et del cookie
!

In generale esistono due tipi di cookie:


Cookie di Sessione
Cookie temporanei che scompaiaio quando lutente chiude il browser.

Cookie Persistenti
Cookies che esistono finch
Viene raggiunta la data di fine validit Vengono esplicitamente cancellati dallutente

! public

int getMaxAge(); ! public void setMaxAge (int lifetime);


Tecnologie di Sviluppo per il Web 10

Data di validit di un cookie


!

Il metodo setMaxAge() indica al browser per quanto tempo (in secondi) deve vivere il cookie. Valori possibili:
Valore negativo (default): crea un cookie di sessione. 0: dice al browser di cancellare il cookie. Valore positivo: qualsiasi numero di secondi. Per esempio, per creare un cookie che esiste per unora:
cookie.setMaxAge(3600);
Tecnologie di Sviluppo per il Web 11

Path di un cookie
!

! ! !

Di default, il browser invia il cookie solo ad URL che si riferiscono alla directory in cui il cookie stato creato oppure alle sue sottodirectory public String getPath(); public void setPath (String path); Se si vuole che il cookie venga inviato a tutte le pagine, allora bisogna settare la path a /
cookie.setPath ("/");
Tecnologie di Sviluppo per il Web 12

Versione del cookie


! Di

default, le API Servlet creano Cookie di Versione 0. ! Usando il metodo setVersion() si pu specificare che la il cookie un cookie versione 1 (il supporto per cookies con versione 1 di solito non implementato) ! public int getVersion(); ! public void setVersion (int version);
Tecnologie di Sviluppo per il Web 13

Cookie sicuri
! Se

il parametro di sicurezza viene settato, allora il browser restituisce il cookie solo se sta comunicando su una connessione sicura (https) ! Per default, i cookies sono non-sicuri ! public boolean getSecure(); ! public void setSecure(boolean);
Tecnologie di Sviluppo per il Web 14

Inviare un cookie
!

! !

Una volta creato il cookie e settati i suoi attributi, bisogna aggiungerlo alloggetto response Aggiungendolo alla risposta, il cookie viene trasmesso al browser Esempio:
Cookie school = new Cookie (school, NYU); school.setMaxAge (3600); response.addCookie(school);
Tecnologie di Sviluppo per il Web 15

Leggere i cookie
! Per

leggere i cookie bisogna prelevarli dalloggetto request ! La classe HttpServletRequest ha un metodo getCookies()
Restituisce un array di cookie (oggetti della classe Cookie) Restituisce null se non ci sono cookie
Tecnologie di Sviluppo per il Web 16

Esempio: Contatore di accessi 1


! Vogliamo

costruire una servlet

Conta quanti accessi effettua un utente Lo mostra a video


!

abbastanza semplice da fare:

Creiamo un cookie contatore Ne incrementiamo il valore ad ogni accesso


Tecnologie di Sviluppo per il Web 17

Esempio: Contatore di accessi 2


! ! ! ! !

Leggiamo larray di cookie dalloggetto request Iteriamo sullarray alla ricerca del cookie contatore Se tale cookie non esiste, ne creiamo uno e settiamo il suo valore a 0 Incrementiamo il valore del cookie di 1 Aggiungiamo il cookie alloggetto response
Tecnologie di Sviluppo per il Web 18

import java.io.*; import javax.servlet.*; import javax.servlet.http.*;

public class CookieCounter extends HttpServlet {

CookieCounter

public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { String name, value = null; Cookie cookie; int counter; res.setContentType("text/html"); //Tenta di estrarre il cookie contatore Cookie[] cookies = req.getCookies(); for (int i=0; i<cookies.length; i++) { cookie = cookies[i]; name = cookie.getName(); if (name.equals("contatore")) value = cookie.getValue(); }
Tecnologie di Sviluppo per il Web 19

//Se possibile, converti il valore del cookie ad int. Altrimenti setta il valore a 0. if (value != null) counter = Integer.parseInt (value); else counter = 0; //Incrementa il contatore counter++; //Crea un nuovo cookie contatore Il cookie esister per un anno (circa) cookie = new Cookie ("contatore", Integer.toString(counter)); cookie.setMaxAge(60*60*24*365); res.addCookie(cookie); //Manda in output il numero di visite PrintWriter out = res.getWriter(); out.println ("<HTML><BODY>"); out.println ("<H1>Numero di visite: "+counter); out.println ("</H1>"); out.println ("</BODY></HTML>"); out.close(); }}

Tecnologie di Sviluppo per il Web

20

Servlet e sessioni
!

Le sessioni sono un altro modo per conservare lo stato. In pratica il server gestisce una mappa: ogni entry rappresenta una sessione di lavoro distinta
La chiave della mappa un identificatore per la sessione Il valore della mappa un oggetto che contiene informazioni associate a quella specifica sessione

In tutte le risposte al client il server aggiunge automaticamente e in maniera trasparente un cookie che contiene l'identificatore di sessione Attraverso questo identificatore, ad ogni richiesta il server in grado di recuperare l'oggetto con le informazioni associate alla sessione
Tecnologie di Sviluppo per il Web 21

Gestione della sessione 1


!

I contenitori J2EE (e.g, Tomcat) mettono a disposizione del programmatore infrastruttura e API per una gestione trasparente di questo meccanismo Nel processare una richiesta, il programmatore deve semplicemente chiedere all'oggetto HttpServeltRequest l'oggetto associato alla sessione
Tecnologie di Sviluppo per il Web 22

Gestione della sessione 2


!

Il contenitore, in maniera trasparente, estrae dalla richiesta l'identificatore di sessione e lo usa per recuperare dalla mappa delle sessioni, l'oggetto associato allidentificatore Se nella richiesta non viene trovato nessun identificatore (presumibilmente la prima richiesta) allora un identificatore (e una relativa entry nella mappa delle sessioni) vengono creati automaticamente
Tecnologie di Sviluppo per il Web 23

HttpSession
! L'oggetto

associato alla sessione (in pratica uno dei valori della mappa delle sessioni) una istanza della classe HttpSession ! Per ottenerlo dalla richiesta esistono due metodi (di HttpServletRequest):
HttpSession getSession() HttpSession getSession(boolean mode)
Tecnologie di Sviluppo per il Web 24

getSession
!

HttpSession getSession()
restituisce la sessione a cui appartiene la richiesta oppure crea una nuova sessione

HttpSession getSession(boolean mode) getSession(true) equivalente a getSession() getSession(false) restituisce la sessione a cui appartiene la richiesta oppure null; non inizializza una nuova sessione nel caso in cui la richiesta non sia gi associata ad una sessione
Tecnologie di Sviluppo per il Web 25

La classe HttpSession 1
!

Offre metodi per


Gestione sessione Gestione informazioni associate alla sessione

Metodi la gestione della sessione:


invalidate()
chiude la sessione di lavoro

boolean isNew()
verifica se la sessione nuova o meno (si veda il comportamento del metodo getSession())
Tecnologie di Sviluppo per il Web 26

La classe HttpSession 2
setMaxInactiveInterval(int interval)
Specifica lintervallo di tempo, in secondi, tra successive richieste del client prima che il servlet container invalider la sessione

getMaxInactiveInterval() getLastAccessedTime() getCreationTime()

Tecnologie di Sviluppo per il Web

27

La classe HttpSession 3
!

Le informazioni sono memorizzate nell'oggetto istanza di HttpSession come attributi (coppie nome-valore)
Il nome una stringa Il valore un oggetto

Esistono dei metodi per aggiungere, togliere attributi associati alla sessione

prendere, (oggetti)

Object getAttribute(String name) void setAttribute(String name, Object value) void removeAttribute(String name)
Tecnologie di Sviluppo per il Web 28

String body; Integer n; res.setContentType (text/html); PrintWriter out = res.getWriter(); out.println (<html>); out.println (<head); out.println (<title>Numero visite</html>); out.println (</head>); out.println (<body); HttpSession ses = req.getSession(true); if (ses.isNew()) { n = new Integer(1); body = Benvenuto!; }else { n = (Integer)ses.getAttribute(visite); n = new Integer (n.intValue()+1); body = Questa la tua visita numero + n; } ses.setAttribute (visite, n); out.println (body); out.println (</body>); out.println (</html>);
Tecnologie di Sviluppo per il Web

in doGet

29

URL rewriting 1
!

Non sempre limplementazione delle sessioni basata su cookie funziona: le impostazione del browser potrebbero richiedere di rifiutare i cookie J2EE offre una valida alternativa
La soluzione alternativa consiste nella cosiddetta riscrittura degli URL (URL rewriting): si aggiunge un identificatore della sessione agli URL nel codice HTML Anche in questo caso, la soluzione trasparente al programmatore
Tecnologie di Sviluppo per il Web 30

URL rewriting 2
!

Se il client rifiuta i cookie, possibile chiedere al contenitore di aggiungere agli URL nel codice HTML della risposta lidentificatore della sessione
esempio: http://localhost:8080/esempi/Show;jsessionid=E4D371A0710 pagine che appartengono a sessioni diverse conterranno URL diversi

Il client restituisce lidentificatore della sessione nella richiesta HTTP


In questo modo viene identificata la sessione L'identificazione avviene in maniera trasparente

Tecnologie di Sviluppo per il Web

31

URL rewriting 3
Il contenitore riscrive gli URL solo se il programmatore lo richiede esplicitamente ! Per forzare la riscrittura delle URL si usa il metodo String encodeURL(String url) di HttpServletResponse
!

il parametro url rappresenta lURL non riscritto il risultato del metodo lURL riscritto dal contenitore
!

Se il programmatore richiede la riscrittura delle URL il comportamento del contenitore quello di commutare automaticamente tra le due modalit:
se i cookie vengono rifiutati, viene attivata la riscrittura degli URL, altrimenti la sessione viene propagata attraverso un cookie
Tecnologie di Sviluppo per il Web 32

URL rewriting 4
!

Poich la riscrittura delle URL avviene in modo trasparente da parte del contenitore
lutente deve solo usare encodeURL()

Il contenitore si preoccupa di adottare la riscrittura delle url solo nel caso in cui i cookie vengono rifiutati quindi conveniente utilizzare sempre encodeURL() per rendere pi robusta la gestione delle sessioni
out.println(response.encodeURL("link.html");
Tecnologie di Sviluppo per il Web 33

Contesto dellapplicazione 1
!

Per contesto dell'applicazione si intende linsieme delle informazioni che sono condivise da tutte le classi (servlet) della applicazione ServletContext
oggetto che rappresenta lapplicazione Web in cui la servlet viene eseguita Tutte le servlet hanno un ServletContext che si ottiene invocando il metodo ServletContext getServletContext() ereditato da GenericServlet
Tecnologie di Sviluppo per il Web 34

Contesto dellapplicazione 2
! Offre

due funzioni principali

consentire la comunicazione tra i servlet dellapplicazione e il contenitore manipolare gli attributi dellapplicazione (oggetti condivisi accessibili da tutte le classi dellapplicazione)

Tecnologie di Sviluppo per il Web

35

Manipolare gli attributi dellapplicazione


!

possibile prendere, aggiungere e rimuovere oggetti dal contesto dell'applicazione Ci avviene attraverso alcuni metodi che consentono di gestire una mappa di coppie chiave/valore
Object getAttribute(String chiave) void setAttribute(String chiave, Object valore) void removeAttribute(String chiave)
Tecnologie di Sviluppo per il Web 36

Esempio

ServletContext sc = getServletContext(); List elencoDocenti = (List) sc.getAttribute("docenti"); sc.setAttribute("numDocenti", new Integer(3));

Tecnologie di Sviluppo per il Web

37

import java.io.*; import javax.servlet.*; import javax.servlet.http.*;

public class login extends HttpServlet { public void init(ServletConfig config) throws ServletException { super.init(config); ServletContext sc = getServletContext(); sc.setAttribute("connessi", new Integer(0)); }

login.java

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int val=0; response.setContentType("text/html"); PrintWriter out = response.getWriter(); String titolo = "Login"; ServletContext sc = getServletContext(); synchronized(sc) { val = ((Integer)sc.getAttribute("connessi")).intValue(); sc.setAttribute("connessi", new Integer(val+1)); } out.println("<HTML>\n" + "<HEAD><TITLE>" + titolo + "</TITLE></HEAD>\n"); out.println("<BODY>\n" + "<H1 ALIGN=CENTER>"+titolo+"</H1>"); out.println("Sono connessi " + (val +1) + " utenti"); out.println("</BODY></HTML>"); } } Tecnologie di Sviluppo per il Web 38

import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class logout extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int val; response.setContentType("text/html"); PrintWriter out = response.getWriter(); String titolo = "Logout"; ServletContext sc = getServletContext(); synchronized(sc) { val = ((Integer)sc.getAttribute("connessi")).intValue(); sc.setAttribute("connessi", new Integer(val-1)); } out.println("<HTML>\n" ); out.println("<HEAD><TITLE>" + titolo + "</TITLE></HEAD>\n"); out.println("<BODY">\n" + "<H1 ALIGN=CENTER>"+titolo+"</H1>"); out.println("Sono connessi " + (val - 1) + " utenti"); out.println("</BODY></HTML>"); } }

logout.java

Tecnologie di Sviluppo per il Web

39