Il 0% ha trovato utile questo documento (0 voti)
12 visualizzazioni30 pagine

L08 - Servlet Part3

Il documento descrive il contesto delle Servlet in una Web application, evidenziando l'importanza dell'interfaccia ServletContext e dei parametri di inizializzazione. Viene trattata la gestione dello stato tramite sessioni e cookie, con dettagli su come accedere e gestire le sessioni tramite HttpSession. Infine, si discute l'uso di include e forward per la gestione delle richieste e delle risposte nelle Servlet.

Caricato da

donmatteo
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
12 visualizzazioni30 pagine

L08 - Servlet Part3

Il documento descrive il contesto delle Servlet in una Web application, evidenziando l'importanza dell'interfaccia ServletContext e dei parametri di inizializzazione. Viene trattata la gestione dello stato tramite sessioni e cookie, con dettagli su come accedere e gestire le sessioni tramite HttpSession. Infine, si discute l'uso di include e forward per la gestione delle richieste e delle risposte nelle Servlet.

Caricato da

donmatteo
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 30

Servlet context

• Ogni Web application esegue in un contesto:


• corrispondenza 1:1 tra una Web application e suo contesto

• L’interfaccia ServletContext è la vista della Web application (del suo


contesto) da parte della Servlet
• Si può ottenere un’istanza di tipo ServletContext all’interno della Servlet
utlizzando il metodo getServletContext()
• Consente di accedere ai parametri di inizializzazione e agli attributi del
contesto
• Consente di accedere alle risorse statiche della Web application (es. immagini)
mediante il metodo InputStream getResourceAsStream(String path)

• IMPORTANTE: Servlet context viene condiviso tra tutti gli utenti, le richieste e
le Servlet facenti parte della stessa Web application
Parametri di inizializzazione del contesto
• Parametri di inizializzazione del contesto definiti all’interno di elementi
di tipo context-param in web.xml

• Sono accessibili a tutte le Servlet della Web application


Attributi di contesto
• Gli attributi di contesto sono accessibili a tutte le Servlet e funzionano come
variabili “globali”
• Vengono gestiti a runtime:
• possono essere creati, scritti e letti dalle Servlet

• Possono contenere oggetti anche complessi (serializzazione/deserializzazione)


Gestione dello stato (di sessione)
• HTTP è un protocollo stateless: non fornisce in modo nativo meccanismi per
il mantenimento dello stato tra diverse richieste provenienti dallo stesso
client
• Le applicazioni Web hanno spesso bisogno di stato. Sono state definite
due tecniche per mantenere traccia delle informazioni di stato:
1. uso dei cookie: meccanismo di basso livello
2. uso della sessione (session tracking): meccanismo di alto livello

• La sessione rappresenta un’utile astrazione ed essa stessa può far ricorso


a due meccanismi base di implementazione:
1. Cookie
2. URL rewriting
Session Tracking and E-Commerce
• Why session tracking?
• When clients at on-line store add item to their shopping cart, how does
server know what’s already in cart?
• When clients decide to proceed to checkout, how can server determine
which previously created cart is theirs?
La classe cookie
• Un cookie contiene un certo numero di informazioni, tra cui:
• una coppia nome/valore
• Caratteri non utilizabili: [ ] ( ) = , " / ? @ : ;
• il dominio Internet dell’applicazione che ne fa uso
• path dell’applicazione
• una expiration date espressa in secondi (-1 indica che il cookie non sarà
memorizzato su file associato, 60*60*24 indica 24 ore)
• un valore booleano per definirne il livello di sicurezza

• La classe Cookie modella il cookie HTTP


• Si recuperano i cookie dalla request utilizzando il metodo getCookies()
• Si aggiungono cookie alla response utilizzando il metodo addCookie()
Esempi di uso di cookie
• Con il metodo setSecure(true) il client viene forzato a inviare il cookie
solo su protocollo sicuro (HTTPS)
Esempi di uso di cookie (2)
• To delete a cookie then you simply need to follow up following three
steps:
• Read an already exsiting cookie and store it in Cookie object
• Set cookie age as zero using setMaxAge() method to delete an existing
cookie
• Add this cookie back into response header

• Es:
Cookie[] cookies = null;
cookies = request.getCookies();
Cookie cookie = cookies[i] //i-esimo Cookie
cookie.setMaxAge(0);
response.addCookie(cookie);
Uso della sessione
• La sessione Web è un’entità gestita dal Web Container
• È condivisa fra tutte le richieste provenienti dallo stesso client:
consente di mantenere, quindi, informazioni di stato (di sessione)
• Può contenere dati di varia natura ed è identificata in modo
univoco da un session ID
• Viene usata dai componenti di una Web application per
mantenere lo stato del client durante le molteplici interazioni
dell’utente con la Web application
URL-Rewriting
• Idea
• Client appends some extra data on the end of each URL that
identifies the session
• Server associates that identifier with data it has stored about
that session
• Es: http://host/path/file.html;jsessionid=1234
• Advantage
• Works even if cookies are disabled or unsupported
• Disadvantages
• Must encode all URLs that refer to your own site
• All pages must be dynamically generated
• Fails for bookmarks and links from other sites
Hidden form fields
• Idea:
<input type=”hidden” name="session” value="...">
• Advantage
• Works even if cookies are disabled or unsupported
• Disadvantages
• Lots of tedious processing
• All pages must be the result of form submissions
Accesso alla sessione
• L’accesso avviene mediante l’interfaccia HttpSession
• Per ottenere un riferimento ad un oggetto di tipo HttpSession si usa il
metodo getSession() dell’interfaccia HttpServletRequest
public HttpSession getSession(boolean createNew);
• Valori di createNew:
• true: ritorna la sessione esistente o, se non esiste, ne crea una nuova
• false: ritorna, se possibile, la sessione esistente, altrimenti ritorna null

• Uso del metodo in una Servlet:


HttpSession session = request.getSession(true);
• Per recuperare l’ID della sessione:
Gestione del contenuto di una sessione
• Si possono memorizzare dati specifici dell’utente negli attributi della
sessione (coppie nome/valore)
• Sono simili agli attributi di contesto, ma con scope fortemente diverso!, e
consentono di memorizzare e recuperare oggetti
Altre operazioni con le sessioni
• String getID() restituisce l’ID di una sessione

• boolean isNew() dice se la sessione è nuova


• void invalidate() permette di invalidare (distruggere) una sessione

• long getCreationTime() dice da quanto tempo è attiva la sessione (in


millisecondi)

• long getLastAccessedTime () dà informazioni su quando è stata


utilizzata l’ultima volta
Session ID e URL Rewriting
• Il session ID è usato per identificare le richieste provenienti dallo stesso utente e mapparle
sulla corrispondente sessione
• Una tecnica per trasmettere l’ID è quella di includerlo in un cookie (session cookie):
sappiamo però che non sempre i cookie sono attivati nel browser
• Un’alternativa è rappresentata dall’inclusione del session ID nella URL: si parla di URL
rewriting
• È buona prassi codificare sempre le URL generate dalle Servlet usando il metodo
encodeURL() di HttpServletResponse
• Usato per garantire una gestione corretta della sessione
• Se il server sta usando i cookie, ritorna l’URL non modificato
• Se il server sta usando l’URL rewriting, prende in input un URL, e se l'utente ha i cookie
disattivati, codifica l'id di sessione nell’URL
• Il metodo encodeURL() dovrebbe essere usato per:
• hyperlink (<a href=“...”>)
• form (<form action=“...”>)
• Es:
String url = "order-page.html";
url = response.encodeURL(url);
Session tracking basics

To Synchronize or not to Synchronize?
• There are no race conditions when multiple different
users access the page simultaneously
• It seems practically impossible for the same user to
access the session concurrently
• The rise of Ajax makes synchronization important
• With Ajax calls, it is actually quite likely that two
requests from the same user could arrive
concurrently
Accumulating a list of user data


Attenzione: scope DIFFERENZIATI (scoped objects)
• Gli oggetti di tipo ServletContext, HttpSession, HttpServletRequest
forniscono metodi per immagazzinare e ritrovare oggetti nei loro
rispettivi ambiti (scope)
• Lo scope è definito dal tempo di vita (lifespan) e dall’accessibilità da
parte delle Servlet
Funzionalità degli scoped object
• Gli oggetti scoped forniscono i seguenti metodi per
immagazzinare e ritrovare oggetti nei rispettivi ambiti
(scope):
• void setAttribute(String name, Object o);
• Object getAttribute(String name);
• void removeAttribute(String name);
• Enumeration getAttributeNames();
Ridirezione del browser
• È possibile inviare al browser una risposta che lo forza ad
accedere ad un’altra pagina/risorsa (ridirezione)
• Possiamo ottenere agendo sull’oggetto response invocando il
metodo
• public void sendRedirect(String url);
• Scenario: When the Servlet show the client a JSP with the results,
and if you don't want the user to be able to refresh and re-submit
the form, then use a sendRedirect
• Es:
String name=request.getParameter("name");
response.sendRedirect("https://www.google.co.in/#q="+name)
;
Includere una risorsa (include)
• Per includere una risorsa si ricorre a un oggetto di tipo
RequestDispatcher che può essere richiesto al contesto indicando la
risorsa da includere
• Si invoca quindi il metodo include passando come parametri
request e response che vengono così condivisi con la risorsa inclusa
• Se necessario, l’URL originale può essere salvato come un
attributo di request
può essere anche una pagina JSP
Inoltro (forward)
• Si usa in situazioni in cui una Servlet si occupa di parte dell’elaborazione
della richiesta e delega a qualcun altro la gestione della risposta
• Attenzione:in questo caso la risposta è di competenza esclusiva della risorsa che
riceve l’inoltro
• Se nella prima Servlet è stato fatto un accesso a ServletOutputStream o
PrintWriter si ottiene una IllegalStateException

• Si deve ottenere un oggetto di tipo RequestDispatcher da request


passando come parametro il nome della risorsa
• Si invoca quindi il metodo forward passando anche in questo caso request
e response può essere anche una pagina JSP
Include e forward
• Scenario (include): When the current Servlet has done some of its job and is using another Servlet
(or JSP) to help with display or other work. If the Servlet using the RequestDispatcher has already
written to the response, then you will need to use the include to send control to another Servlet,
not the forward. Also, if you want to spread the display of a page across multiple pages, use an
Include for each part of a page
• Example: Servlet handles a request from the client and does the necessary work. It then uses
RequestDispatcher#include to add a Header response to all pages, since the header and banner on a
page is the same for all pages on the the site. It then includes a second JSP which displays the content
that is specific to this request. It finally includes a third page that acts as a Footer for all pages on the
site

• Scenario (forward): When the current Servlet is done its job, and hasn't done anything with the
response, you Forward the request and response to another Servlet (or JSP) to finish any work
and to display results
• Example: A Servlet retrieves information from a database and stores it in the request object. It then
forwards the request to a JSP to display the data. User presses refresh, and the control goes to the
Servlet, which again retrieves the data from the database and puts it in the request, forwards to the JSP,
and the JSP sees the data
Include e forward

Potrebbero piacerti anche