Confusione timeout sessione-sessione.setMaxInactiveInterval (0)
-
26-12-2019 - |
Domanda
Sono nuovo di JEE e questo è ciò che mi confonde.Secondo HttpSession.html # setMaxInactiveInterval(intervallo int) documentazione
Un
interval
valore dizero
o meno indica che il la sessione non dovrebbe mai timeout.
ma secondo il mio libro di testo (che ha già pochi anni - quindi mi aspetto che non sia sempre giusto) l'uso di zero come argomento dovrebbe causare immediatamente il timeout della sessione.
Questo codice
public class Test extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
session.setAttribute("foo", 42);
session.setMaxInactiveInterval(0);
out.println(session.getAttribute("foo"));//problem here
}
}
utilizzato su Glassfish 4.0 sembra confermare la teoria dal libro di testo invece della documentazione ufficiale più recente perché restituisce Stato HTTP 500-Errore interno del server con messaggio di errore
java.lang.IllegalStateException: getAttribute: Session already invalidated
Cosa sta succedendo qui?Questo bug di Glassfish 4.0 o la documentazione è sbagliata?O forse c'è una terza opzione?
PS.Questo codice funziona come dovrebbe con valori negativi (la sessione non è invalidata) e sto usando -1
anziché 0
nel mio codice.Sono solo interessato a cosa c'è di sbagliato in 0
.
Soluzione
Il Specifica servlet capitolo sugli stati di timeout della sessione
Per definizione, se il periodo di timeout per una sessione è impostato su -1, il la sessione non scadrà mai.
Così GlasshFish sembra avere che coperto.Non riesco a trovare alcun riferimento nella specifica che dice che lo stesso dovrebbe essere vero per un valore di 0
con setMaxInactiveInterval()
.Tuttavia dice
Il
session-config
definisce i parametri di sessione per questo Web applicazione.Il sottoelementosession-timeout
definisce il valore predefinito intervallo di timeout della sessione per tutte le sessioni create in questo Web applicazione.Il timeout specificato deve essere espresso in un intero numero di minuti. Se il timeout è 0 o inferiore, il contenitore assicura il comportamento predefinito delle sessioni non è mai il timeout.Se questo elemento non è specificato, il contenitore deve impostare il periodo di timeout predefinito.
Altri suggerimenti
Questo è già time out e invalidare
session.setMaxInactiveInterval(0); // mean inactive immediately
Quindi questo è il messaggio di errore corretto.(si prega di fare riferimento testa prima libro per ulteriori riferimenti.)
Si sta tentando di accedere al valore dell'oggetto che non esiste.è già distrutto