SESSION TRACKING DISPENSE
SESSION TRACKING Sessione: In modo generico potremmo dire che una sessione consiste in tutto il tempo in cui un utente, scambiando informazioni con il server, può dire di aver raggiunto o meno lo scopo prefisso una volta abbandonata la comunicazione. I problema è che quindi il server deve poter riconoscere richieste successive di uno stesso utente come parte di una sola interazione; deve poter quindi ricordare dati relativi a precedenti richieste effettuate durante la sessione, per rispondere alle richieste tenendo conto di quanto già fatto. Nel session tracking quindi si tenta di riconoscere un client già incontrato e si tenta di adattare la risposta in base alle sue caratteristiche apprese in interazioni precedenti. Esempio: in un sito di shopping una sessione può essere intesa come tutto il tempo in cui l'utente sfoglia il catalogo del sito (in varie pagine) e inserisce cose nel carrello. La sessione termina con l'acquisto definitivo delle cose nel carrello virtuale. Bisogna cercare quindi tecniche per far in modo di mantenere le informazioni di una sessione con un utente. Tecniche di Session Tracking Esistono varie tecniche di Session Tracking in base anche alla scelta di dove salvare le informazioni, lato client o lato server. Quando si decide di salvare informazioni lato server, bisogna sempre ricordare che ogni operazione va fatta per milioni di utenti. Nel caso in cui invece si opta per il lato client bisogna tener conto che si ha meno sicurezza e non si sa mai effettivamente cosa accade (per esempio il supporto ai cookie potrebbe essere disattivato). Elencando queste tecniche, di alcune indichiamo giusto un accenno, altre le approfondiamo. Autenticazione Autenticazione tramite username e password: permette di associare un username ad un utente in modo tale che è possibile riconoscerlo in qualsiasi momento facendogli fare un login. Questa tecninca ha il vantaggio di essere facilmente implementabile, offre maggiore sicurezza al server che è in grado di proteggere determinate pagine e di identificare ogni utente; lato client risulta comodo perchè l'utente ha la possibilità di autenticarsi da macchine diverse e di continuare a fare le proprie operazioni anche se esce involontariamente dal sito o addirittura dal browser prima che abbia concluso la transazione. Campi nascosti nelle form Un altro approccio è quello dei nascondere i campi nelle form, definendo come type= hidden gli elementi che voglio nascondere. Esempio: <form action="/servlet/moviefinder" method="post">... <input type="hidden" name="zip" value="94040"> <input type="hidden" name="level" value="expert">... </form>
Nei casi in cui l'informazione da passare nascosta è di dimensione non trascurabile, può divenire non conveniente, o addirittura impossibile, utilizzare questa tecnica. Vantaggio: supportata da tutti i browser più diffusi, non richiede nessuna funzionalità speciale al server, anonima. Svantaggio: fallisce nel caso di errore che provoca la chisura del browser e con grandi quantità di dati diventa confusionaria. Cookies Un altro metodo, forse il più importante ed il più usato insieme all'autenticazione, è quello di usare i cookie. Un cookie è un pezzo di informazione testuale mandata dal server Web al browser, che può in seguito venire ripassata dal browser al server. I cookies sono mandati dal server al browser, che li memorizza in un file di testo. I cookie vengono spesso erroneamente ritenuti veri e propri programmi, in realtà essi sono semplici blocchi di dati, incapaci, da soli, di compiere qualsiasi azione sul computer. Un cookie quindi: viene inviato dal server al client (set-cookie); il client (browser) lo salva sul pc locale; viene inviato dal client al server (cookie) per farsi riconoscere nelle richieste successive. Il client memorizza il cookie in un'area apposita (in genere, si usa una directory dove ogni cookie viene memorizzato in un file). Il cookie è composto da una stringa di testo (in genere nome=valore), una data di scadenza (oltre la quale non deve essere considerato valido) e un pattern per riconoscere i domini a cui rimandarlo. È possibile impostare più cookie in una sola risposta HTTP. Il client rimanderà il cookie, senza alcuna modifica, allegandolo a tutte le richieste HTTP che soddisfano il pattern, entro la data di scadenza. Il server può quindi scegliere di assegnare il cookie di nuovo, sovrascrivendo quello vecchio. Contrariamente a quanto comunemente si crede, un cookie non è un piccolo file di testo: può essere sì memorizzato in un file di testo, ma non necessariamente; il cookie vero e proprio è il testo in se. Nel cookie solitamente possiamo trovare sei attributi: Nome/valore è una variabile ed un campo obbligatorio. Dominio (domain) ci permette di specificare il dominio di provenienza del cookie. Scadenza (expiration date) è un attributo opzionale che permette di stabilire la data di scadenza del cookie. Può essere espressa come data, come numero massimo di giorni oppure come Now (adesso) (implica che il cookie viene eliminato subito dal computer dell'utente in quanto scade nel momento in cui viene creato) o Never (mai) (implica che il cookie non è soggetto a scadenza e questi sono denominati persistenti). Percorso (path) specifica il percorso dal quale il cookie viene mandato all'utente finale. Modalità d'accesso (HttpOnly) rende il cookie invisibile a javascript e altri linguaggi client-side presenti nella pagina. Sicuro (secure) indica se il cookie debba essere trasmesso criptato con HTTPS.
Cookie e Java Java, e quindi le servlet, offrono una classe Cookie con: Costruttore: public Cookie(String name, String value), dove il nome identifica il cookie, mentre il valore rappresenta l'informazione associata col cookie. Per mandare un cookie da una servlet ad un client: public void HttpServletResponse.addCookie(Cookie cookie) Per estrarre i cookies da una richiesta di un client una servlets usa public Cookie[ ] HttpServletRequest.getCookies() // per spedire un cookie Cookie cookie = new Cookie("ID","123"); response.addcookie(cookie); // per estrarre i cookies Cookie[ ] cookies = request.getcookies(); if(cookies!= null) { for(int i=0; i<cookies.length; i++) { String name=cookies[i].getname(); String value=cookies[i].getvalue(); } } Altri metodi della classe Cookie: public void setversion(int v) public int getversion() public void setdomain(string pattern), (es,.foo.com per *.foo.com): restrizioni sul dominio; per default, dominio da cui sono state spedite. public String getdomain() public void setmaxage(int expiry): scadenza espressa in secondi; se expiry < 0, scadenza alla fine della sessione; se expiry = 0 immediatamente. public int getmaxage() public void setpath(string url): specifica ulteriormente il dominio del server a cui poi il client dovrà reinviare il cookie. Di default è /, ovvero la pagina corrente. public String getpath() public void setsecure(boolean flag), default false public boolean getsecure() public void setcomment(string comment) public String getcomment() public void setvalue(string newvalue) public String getvalue() public String getname() Il problema più importante coi cookies è che non sempre il browser li accetta. Per default, i cookie vengono eliminati alla fine della sessione di browsing. Per impostare una durata maggiore, si usa il metodo setmaxage, che dà il numero di secondi dopo i quali il cookie verrà eliminato. NB. i browser inviano i cookies esclusivamente allo stesso dominio memorizzato nel cookie.
Variabili di Sessione Le variabili di sessione sono delle variabili che conservano le informazioni per tutta la durata della sessione dell'utente. La sessione dell'utente inizia nel momento della prima apertura di una pagina all'interno dell'applicazione e termina quando l'utente non apre più alcuna pagina nell'applicazione per un certo periodo di tempo oppure quando l'utente chiude esplicitamente la sessione (chiudendo il browser). Per tutta la sua durata, la sessione è specifica per il singolo utente e ogni utente dispone di una sessione separata. Utilizzare le variabili di sessione è utile per archiviare informazioni a cui si può accedere da ogni pagina di un'applicazione Web (sempre all'interno della stessa sessione). Bisogna sapere però che le variabili di sessione possono funzionare soltanto se il browser dell'utente è configurato per accettare i cookie. Nel dettaglio, quando si utilizzano variabili di sessione, il server crea un numero ID per la sessione che identifica in modo univoco l'utente all'avvio della sessione; questo ID viene inviato al browser dell'utente tramite un cookie contenente appunto tale numero. Quando l'utente richiede un'altra pagina al server, invia questo cookie insieme alla richiesta ed il server può leggere in esso il numero ID per identificare l'utente e per recuperare le variabili di sessione dell'utente archiviate nella memoria del server. Variabili di Sessione e Java In Java esiste l'interfaccia HttpSession. Il servlet container usa questa interfaccia per creare una sessione tra un client HTTP e un server HTTP. La sessione persiste per uno specifico periodo di tempo. Corrisponde ad un solo utente, che può visitare il sito anche più volte. Si potrebbe pensare di memorizzare le informazioni che ci servono direttamente attraverso gli attributi della servlet, ma bisogna ricordare che questi sono in comune con gli altri utenti che possono accedere alla stessa servlet in parallelo. Metodi da conoscere: Metodi dell oggetto HttpServletRequest HttpSession getsession (boolean create): restituisce l oggetto HttpSession associato con la richiesta. Se non esiste ancora nessun oggetto HttpSession, ne viene creato uno nel caso create valga true. Metodi dell oggetto HttpSession public void setattribute (java.lang.string name, java.lang.object value): Associa un oggetto alla presente sessione, utilizzando il nome specificato. Se esiste un collegamento con un oggetto con lo stesso nome, questo viene rimpiazzato. java.lang.object getattribute(java.lang.string name): Restituisce l oggetto associato con il nome dato in input, oppure null se non esiste nessun oggetto con quel nome. java.lang.string getid( ) : Restituisce una stringa contenente l id unico della sessione boolean isnew( ) Restituisce true se la sessione con il client è stata creata in occorrenza della presente richiesta long getcreationtime( ) Restituisce l istante di creazione della sessione misurato in millisecondi a partire dalle 00:00 del 1 Gennaio 1970, GMT
long getlastaccessedtime( ) : Restituisce l istante dell ultima richiesta associata alla sessione misurato in millisecondi a partire dalle 00:00 del 1 Gennaio 1970, GMT int getmaxinactiveinterval( ): Restituisce il massimo intervallo di tempo, in secondi, in cui il container può mantenere la sessione aperta, tra due accessi consecutivi da parte del client. java.util.enumeration getattributenames( ) Restituisce un oggetto Enumeration (un elenco) di stringhe contenenti i nomi di tutti gli oggetti associati alla sessione Esempio: // Get the user's session object. // Create a session (true) if one does not exist. HttpSession session = request.getsession( true ); // add a value for user's choice to session session.setattribute( parametro, oggettovalore ); out.println( "This is a new session? "+(session.isnew()+ <br> ); out.println( "The session was created at: " + new Date( session.getcreationtime() ) + "<br />" ); out.println( "You last accessed the session at: " + new Date( session.getlastaccessedtime() ) + "<br />" ); if ( session!= null ) valuenames = session.getattributenames(); else valuenames = null; String name, value; // get value for each name in valuenames while ( valuenames.hasmoreelements() ) { name = valuenames.nextelement().tostring(); value = session.getattribute( name ).tostring(); out.println( Parametro: name + "Valore" + value ); }