2016-01-30 15 views
6

Non sono sicuro se ho capito:Qual è la differenza tra session-timeout e max-age in web.xml?

<session-config> 
    <session-timeout>30</session-timeout> <!-- 30 minutes! --> 
    <cookie-config> 
     <http-only>true</http-only> 
     <max-age>1800</max-age> <!-- 1800 seconds: 30 minutes! --> 
    </cookie-config> 
    <tracking-mode>COOKIE</tracking-mode> 
</session-config> 

Inoltre, c'è un modo di configurare tutti i cookie in web.xml? Questo sembra applicarsi solo ai cookie di sessione. Ho bisogno di un filtro per tale funzione?

+1

I campi cookie come max-age devono essere impostati dall'autore del cookie. Poiché questo cookie di sessione viene creato dal contenitore, il contenitore fornisce la configurazione per i campi. Se un cookie viene generato dalla tua app, la tua app deve impostare i valori dei campi corretti. – ZhongYu

risposta

13

Perché ne abbiamo bisogno? Citando il servlet 3 spec:

Nel protocollo HTTP, non v'è alcun segnale di terminazione esplicita quando un client non è più attivo. Ciò significa che l'unico meccanismo con cui può essere utilizzato per indicare quando un client non è più attivo è un periodo di tempo .

lo schema web-commons davvero unghie spiegarla:

L'elemento session-timeout definisce l'intervallo di timeout sessione predefinita per tutte le sessioni create in questa applicazione web. Il timeout specificato deve essere espresso in un numero intero di minuti.

Se il timeout è 0 o meno, il contenitore garantisce che il comportamento predefinito delle sessioni non scada mai. Se questo elemento non è specificato, il contenitore deve impostare il suo periodo di timeout predefinito .

Lo schema web-commons anche qualcosa per noi circa la max-age:

La durata (in secondi) che verrà assegnato a qualsiasi sessione di tracciamento cookie creati da questa applicazione web. Il valore predefinito è -1

Per riassumere:

  • session-timeout configura la durata della sessione si soffermerà intorno consumare risorse del server, anche se non attivamente l'accesso.

  • max. configura per quanto tempo il browser client manterrà il cookie di sessione. Questa impostazione si applica solo alla durata del cookie: non farà nulla se si sta usando la riscrittura dell'URL e non ha assolutamente nulla a che fare con quanto tempo le sessioni sono conservate sul lato server. Il valore predefinito, -1, mantiene il cookie per tutto il tempo in cui la sessione del browser è attiva.

Servlet pagina 3.1 JSR: http://download.oracle.com/otndocs/jcp/servlet-3_1-fr-eval-spec/index.html

Il web-commons XSD è disponibile all'indirizzo: http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/web-common_3_0.xsd

La domanda modificato chiede:

Inoltre, c'è qualche modo configurare TUTTI i cookie in web.xml? Sembra che si applichi solo ai cookie di sessione. Ho bisogno di un filtro per tale funzione?

Non credo. Il modo più semplice per fare ciò è IMHO nella sottoclasse javax.servlet.http.HttpServletResponseWrapper che sovrascrive addCookie().

+0

Quindi, se il mio limite di età per i cookie di sessione è inferiore alla mia sessione di timeout, è possibile che la sessione continui a vivere nella memoria dell'app Web, ma il client non invierà più il cookie di sessione? –

+0

@KorayTugay non è possibile confrontare direttamente i due valori, essi misurano cose diverse (e non mi riferisco solo alle diverse unità). Vedi la mia risposta per ulteriori informazioni: http://stackoverflow.com/a/40825334/274677 –

1

<session-timeout> è la durata massima della sessione non utilizzata (dal momento dell'ultima richiesta). Quando una sessione non viene utilizzata (nessuna richiesta) per quella quantità di tempo, l'applicazione sul lato server uccide la sessione (puoi prendere questo evento e implementare il tuo comportamento).

Il cookie di sessione max-age definisce la durata di questo cookie memorizzato nel browser dell'utente.

Per quanto riguarda, quando un cookie di sessione raggiunge la sua età massima, la sessione è costretta a disconnettersi. Nell'altro caso, quando una sessione viene disconnessa dall'evento session-timemout, il cookie di sessione potrebbe ancora essere presente sul browser utente

1

Prima di spiegare cosa sono sicuri di capire alcune cose. Dalla tua domanda, è chiaro che si è già a conoscenza del primo, ma forse confuso circa la seconda voce nella lista qui sotto:

  • le due impostazioni utilizzano diverse unità (session-timeout è espresso in minuti, mentre max-age è espresso in secondi)
  • misurano il tempo in modi diversi: session-timeout misure temporali in modo relativo, max-age misure temporali in modo assoluto (spiegati più avanti)
  • vengono presi in considerazione e applicate dai diversi componenti software. Il session-timeout viene preso in considerazione dal contenitore, mentre lo max-age viene preso in considerazione e applicato dal browser dell'utente. Equivalentemente, si può dire che session-timeout si applica al lato server mentre max-age si applica al lato client.

session-timeout recare il massimo durata di inattività prima che il contenitore decide di distruggere l'oggetto di sessione che rappresenta la "connessione" nel server. Ciò significa che è possibile impostare il valore di session-timeout a solo 1 minuto e continuare a mantenere l'oggetto di sessione nel server per sempre finché il browser invia messaggi HTTP GET, POST ecc. Al server una volta ogni 59 secondi.

max-age viene utilizzato dal browser dell'utente per calcolare un punto assoluto, fisso, nel tempo, oltre il quale il cookie di sessione (JSESSIONID in Java) non verrà più inviato al server. Questo è un valore assoluto e, come tale, l'attività o l'inattività di per conto dell'utente non fa alcuna differenza. Ecco perché, se si esaminano i biscotti nella console sviluppatore del browser si vede un timestamp assoluto per il cookie di sessione:

enter image description here

Caveat: Un'eccezione alla descrizione di cui sopra sul valore della max-age denota una punto fisso nel tempo, è se viene utilizzato il valore appositamente interpretato -1.In tal caso è quello che si vede nella console sviluppatore:

enter image description here

& hellip; e anche come spiegato in this answer ciò significa che il browser continuerà a inviare il cookie per la durata della "sessione del browser". Sto mettendo "sessione del browser" tra virgolette per differenziarlo dalle sessioni lato server. Il modo in cui il concetto di una sessione viene compreso da un browser (ad esempio se diverse schede corrispondono a sessioni diverse) è specifico dell'implementazione.

Data la diversità semantica di session-timeout e max-age, ne consegue che i tentativi di "allineare" i due valori come la web.xml estratto da Lei forniti nella tua domanda:

<session-config> 
    <session-timeout>30</session-timeout> <!-- 30 minutes! --> 
    <cookie-config> 
     <http-only>true</http-only> 
     <max-age>1800</max-age> <!-- 1800 seconds: 30 minutes! --> 
    </cookie-config> 
    <tracking-mode>COOKIE</tracking-mode> 
</session-config> 

& hellip; probabilmente indicano confusione.

max-age fornisce un limite rigido (a meno che non viene utilizzato il valore speciale -1), mentre session-timeout fornisce in modo efficace senza limiti, fino a quando l'utente utilizza attivamente la sessione.

Per quanto riguarda il difetto ed i valori appositamente interpretati (0 per la session-timeout e -1 per max-age) e se è possibile configurare questi valori per tutti i cookie (in contrasto con appena il cookie di sessione), questi punti sono spiegati in this answer.

Problemi correlati