Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
! 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
Costruire un cookie
!
Il nome ed contenere:
il
valore
non
dovrebbero
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
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
!
Cookie Persistenti
Cookies che esistono finch
Viene raggiunta la data di fine validit Vengono esplicitamente cancellati dallutente
! public
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
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
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
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(); }}
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
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
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
!
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
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
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
consentire la comunicazione tra i servlet dellapplicazione e il contenitore manipolare gli attributi dellapplicazione (oggetti condivisi accessibili da tutte le classi dellapplicazione)
35
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
37
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
39