English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Esempio dettagliato di gestione delle sessioni di JavaWeb

Introduzione alla sessione (Session)

La sessione si riferisce al processo di interazione tra l'utente e l'applicazione Web utilizzando lo stesso processo del browser in un periodo di tempo.

La sessione (Session) viene generalmente utilizzata per tracciare lo stato dell'utente, memorizzando le informazioni dell'utente nel processo del browser.

Quando l'utente chiude il browser, la sessione precedente non può essere recuperata di nuovo (il caso in cui maxAge del Cookie è -1). Aprire un nuovo browser inizierà una nuova sessione.

Classe javax.servlet.http.HttpSession. Ogni HttpSession rappresenta una sessione dell'utente.
Il tempo di scadenza predefinito di ogni sessione è di 30 minuti.

Quando il browser visita per la prima volta il server, indipendentemente da quale pagina viene visitata per prima, il server assegna un identificatore di sessione unico all'utente, ossia jsessionid, e lo restituisce all'utente sotto forma di cookie.
Di seguito è illustrato un intestazione di risposta (l'immagine è basata su Servlet 3.0, in Servlet 2.5 non esiste l'attributo HttpOnly)

Il server crea una sessione per ogni utente, ossia un oggetto HttpSession, e lo conserva sul lato server.

Allora, come il server sa se l'utente è ancora il medesimo quando l'utente visita di nuovo il server?

Quando il browser visita di nuovo il server, porta con sé un cookie che contiene jsessionid per accedere al server. Il server, in base a questo id, restituisce l'oggetto HttpSession dell'utente, mantenendo così la sessione.
Allora, è possibile implementare la stessa sessione su diversi browser?

Di seguito è riportato un URL tipico, che ha un certo effetto ingannevole e può implementare la stessa sessione su diversi browser:

http://localhost:8080/day07_2/CNCookieServlet;jsessionid=F8692D61CD46D094DBB7A8FC7387649C )

La relazione tra il browser e il server è illustrata nelle due immagini seguenti:


HttpSession:

In un Servlet, ottenere l'oggetto sessione tramite il metodo HttpServletRequest.getSession.

Le seguenti metodologie dell'interfaccia HttpSession vengono utilizzate per condividere dati nel contesto della sessione:

getAttribute(“name”)
setAttribute(“name”,object);
getAttributeNames()
removeAttrubute(“name”)

Invalidate(); - Questo metodo elimina forzatamente la sessione in cache del server.

Esempio:

In un Servlet, impostare alcuni valori nell'oggetto HttpSession.

Passare a un altro servlet tramite collegamento ipertestuale o altri metodi e visualizzare le informazioni tramite getAttribute.

Chiamare getAttribute in qualsiasi Servlet per visualizzare le informazioni.

Chiudi questo browser, visita di nuovo il servlet che ottiene le informazioni e vedrai che non ci sono più informazioni.

Ecco un esempio:

String name=request.getParameter("name"); 
request.setAttribute("name", "request---"+name); 
request.getSession().setAttribute("name", "session---"+name); 
getServletContext().setAttribute("name", "application---"+name); 

L'identificatore unico dell'Session è Id:

Ogni sessione ha un identificatore unico, ovvero l'ID.

Quando il browser ottiene una nuova sessione, l'utente può passare a session.geId(); per stampare il valore dell'ID.

Senza chiudere il browser, saltare tra più pagine utilizza la stessa sessione.

Ad esempio:

request.getSession().getId() 

Cos'è l'uscita sicura:

Quando l'utente esce, dovrebbe cancellare le proprie informazioni dalla sessione - ossia uscire in modo sicuro.

L'uscita sicura è finalizzata a cancellare completamente le informazioni lasciate sul server, per prevenire intrusioni.

Session.invalidate();

1、request.getSession().invalidate();

In questo modo possiamo eliminare l'oggetto corrispondente nel pool di sessioni.

2、Session.removeAttribute(…)

Ad esempio:

request.getSession().removeAttribute("realCode");

Usato per rimuovere le proprietà dell'oggetto sessione

Tracciamento della sessione tramite riscrittura dell'URL:

Come già detto, il container Servlet salva un SessionID sul client, e in seguito, ogni volta che il browser invia una richiesta HTTP, questa contiene il SessionID. Il container Servlet legge questo SessionID dalla richiesta HTTP, lo utilizza per recuperare l'oggetto HttpSession dal container, per tracciare a quale sessione appartiene la richiesta HTTP, questo processo è noto come tracciamento della sessione.

Se il browser supporta i Cookie, il container Servlet memorizza il SessionID come Cookie sul client del browser. Ma se per motivi di sicurezza l'utente ha disabilitato i Cookie, come fa il container Servlet a tracciare la sessione?

Prima di tutto, disabilitiamo i Cookie nel browser IE (attenzione: non funziona su alcuni sistemi GHOST).

IE>Strumenti>Opzioni Internet>Privacy>Avanzate, quindi disabilita i Cookie:

Possiamo aggiungere un collegamento ipertestuale del genere nella pagina principale: (il codice relativo a SaveServlet.java, GetServlet.java e LogoutServlet.java è riportato alla fine)

<h2>Dimostrazione della tecnica di riscrittura dell'URL - risoluzione del problema di sessione invalida dopo che l'utente ha disabilitato i cookie</h2> 
<form action="<%=response.encodeURL("saveServlet") %>" method="post"> 
name:<input type="text" name="name"/><br/> 
<input type="submit"/> 
</form> 
<a href="<%=response.encodeURL("getServlet") %>">Riscrivi l'URL - leggere alcuni dati delle container</a><br/> 
<a href="<%=response.encodeURL("logoutServlet") %>">Riscrivi l'URL - uscita sicura</a> 

Questa frase <form action=“<%=response.encodeURL(“/aa”)%>”> può realizzare questa funzione

Dopo aver disabilitato il cookie, il browser può ancora ricevere i cookie inviati dal server, ma il browser può accettare ma non inviare al server, senza poter inviare il cookie, non si può ottenere l'oggetto corrispondente nel pool di sessioni.

Il codice sopra, dopo aver inserito il valore desiderato nel modulo, vai all'indirizzo dell'hyperlink getServlet qui sotto per vedere se viene ancora visualizzato il valore inserito, la risposta è affermativa. Questo percorso di accesso è simile a

http://localhost:8080/day07_2/CNCookieServlet;jsessionid=F8692D61CD46D094DBB7A8FC7387649C Il, seguito da jsessionid=F8692D61CD46D094DBB7A8FC7387649C è il suo ID, così, puoi accedere a questo indirizzo web anche su un altro browser.
Devo aggiungere: (la seguente situazione si verifica quando scrivo il valore JSESSIONID e value dell'oggetto HttpSession nel cookie, questo cookie sovrascrive quello creato dal sistema, è come se lo avessi creato io stesso, ho impostato la durata a dieci minuti, senza sovrascrittura, il cookie si cancella quando il browser viene chiuso e non si vedono i seguenti fenomeni).

In questi due casi di disabilitazione o non disabilitazione del cookie, l'id dell'oggetto nuovo nella session pool è diverso, quindi se inserisci un valore di name nel modulo quando il cookie è disabilitato, i risultati saranno come segue:

e jsessionid di 2BB51EBDEAAF14D19656C71E1B6F9FF6

Poi cambiamo immediatamente al modalità non disabilitata del cookie, inseriamo un altro nome come Tom, i risultati naturalmente saranno due Tom, jsessionid di

203F9E4DB5D874476B81DAF350661B6A, diverso dal caso in cui è disabilitato, questo porta ai risultati seguenti

Poi chiuderemo il browser, riapriremo e controlliamo i risultati con il cookie non disabilitato, come segue:

Di seguito, posterò il codice principale:

SaveServlet.java

package cn.hncu.servlets.session; 
import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.http.Cookie; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
public class SaveServlet extends HttpServlet { 
public void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
doPost(request, response); 
} 
public void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
response.setContentType("text/html;charset=utf-8"); 
PrintWriter out = response.getWriter(); 
request.setCharacterEncoding("utf-8"); 
String name=request.getParameter("name"); 
request.setAttribute("name", "request---"+name); 
request.getSession().setAttribute("name", "session---"+name); 
getServletContext().setAttribute("name", "application---"+name); 
//Esempio di un'applicazione che unisce la tecnologia cookie e sessione---※Funzione: Permette agli utenti di accedere alle informazioni nella sessione anche se chiudono il browser e tornano entro 10 minuti 
//Scrivere un cookie per il client con chiave "JSESSIONID" e valore "sessionid", 
Cookie c=new Cookie("JSESSIONID", request.getSession().getId()); 
c.setMaxAge(60*10);//Il fenomeno è causato da questa frase, senza questa frase non si sarebbe verificato il fenomeno menzionato sopra 
c.setPath(request.getContextPath()); 
response.addCookie(c); 
out.println("Salvataggio avvenuto..."); 
out.flush(); 
out.close(); 
} 
}

GetServlet.java

package cn.hncu.servlets.session; 
import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
public class GetServlet extends HttpServlet { 
public void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
response.setContentType("text/html;charset=utf-8"); 
PrintWriter out = response.getWriter(); 
out.println("<!DOCTYPE HTML PUBLIC \ 
out.println("<HTML>"); 
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); 
out.println(" <BODY>"); 
String reqName=(String) request.getAttribute("name"); 
String seName=(String) request.getSession().getAttribute("name"); 
String appName=(String) getServletContext().getAttribute("name"); 
out.println(reqName+"<br/>"); 
out.println(seName+"<br/>"); 
out.println(appName+"<br/>"); 
out.println(" </BODY>"); 
out.println("</HTML>"); 
out.flush(); 
out.close(); 
} 
}

LogoutServlet.java

package cn.hncu.servlets.session; 
import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
public class LogoutServlet extends HttpServlet { 
public void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
response.setContentType("text/html;charset=utf-8"); 
PrintWriter out = response.getWriter(); 
//Esortazione di uscita sicura---basta rendere l'oggetto sessione non valido 
request.getSession().invalidate(); 
out.println("Esortazione di uscita sicura..."); 
} 
} 

Come sopra descritto, l'editor ha introdotto la gestione delle sessioni di JavaWeb per voi, sperando che sia utile. Se avete qualsiasi domanda, lasciate un messaggio, l'editor risponderà prontamente!

Dichiarazione: il contenuto di questo articolo è stato prelevato da Internet, il diritto d'autore è di proprietà del rispettivo proprietario, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, il sito web non detiene il diritto di proprietà, non è stato editato manualmente e non assume responsabilità legali correlate. Se trovi contenuti sospetti di violazione del copyright, sei invitato a inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata, il sito web rimuoverà immediatamente il contenuto sospetto di violazione del copyright.

Ti potrebbe interessare