In quali condizioni viene creato un JSESSIONID?


276

Quando / quali sono le condizioni quando JSESSIONIDviene creato un?

È per un dominio? Ad esempio, se ho un server di app Tomcat e distribuisco più applicazioni Web, verrà JSESSIONIDcreato un diverso per contesto (applicazione Web) o sarà condiviso tra le applicazioni Web purché si tratti dello stesso dominio?

Risposte:


324

Il cookie JSESSIONID viene creato / inviato quando viene creata la sessione. La sessione viene creata quando il codice chiama request.getSession()o request.getSession(true)per la prima volta. Se vuoi solo ottenere la sessione, ma non crearla se non esiste, usa request.getSession(false)- questo ti restituirà una sessione o null. In questo caso, la nuova sessione non viene creata e il cookie JSESSIONID non viene inviato. (Questo significa anche che la sessione non è necessariamente creata alla prima richiesta ... tu e il tuo codice avete il controllo quando viene creata la sessione)

Le sessioni sono per contesto:

SRV.7.3 Session Scope

Gli oggetti HttpSession devono essere definiti a livello di applicazione (o contesto servlet). Il meccanismo sottostante, come il cookie utilizzato per stabilire la sessione, può essere lo stesso per contesti diversi, ma l'oggetto a cui si fa riferimento, inclusi gli attributi in tale oggetto, non deve mai essere condiviso tra contesti dal contenitore.

( Specifica servlet 2.4 )

Aggiornamento: ogni chiamata alla pagina JSP crea implicitamente una nuova sessione se non c'è ancora alcuna sessione. Questo può essere disattivato con la session='false'direttiva page, nel qual caso la variabile di sessione non è affatto disponibile sulla pagina JSP.


2
non è possibile creare una sessione senza una chiamata esplicita a getSession? per quanto riguarda "il contenitore non deve mai essere condiviso tra contesti", websphere ha un'opzione per condividere sessioni, che è la motivazione della domanda :)
joshjdevl

Non se usi solo l'API Servlet. Tuttavia, potrebbero esserci estensioni specifiche del server (come la condivisione della sessione di Websphere, come sottolineato).
Peter Štibraný,

Credo che il tuo file context.xml possa controllare la creazione automatica della sessione se il tuo tag <Contesto> contiene un attributo cookie, ad es. <Cookie
BT

In questo momento sto ottenendo molti hit sul mio filtro per creare una sessione e sembra che sia solo dopo che il secondo hit (non un secondo aggiornamento della pagina) è stato creato, questa chiamata mia attenzione "la sessione non è necessariamente creata alla prima richiesta .." è è collegato? potresti fare un esempio del perché questo non è necessariamente creato alla prima richiesta? Grazie!
jpganz18,

@ jpganz18: se chiami semplicemente request.getSession()o request.getSession(true), ricevi una sessione esistente o nuova. Tuttavia, se il tuo codice chiama request.getSession(false), otterrai una sessione esistente o null, se non esiste alcuna sessione.
Peter Štibraný,

49

Ecco alcune informazioni su un'altra fonte di JSESSIONIDcookie:

Stavo solo eseguendo il debug del codice Java che gira su un server Tomcat. Non stavo chiamando request.getSession()esplicitamente da nessuna parte nel mio codice ma ho notato che JSESSIONIDera ancora impostato un cookie.

Ho finalmente dato un'occhiata al codice Java generato corrispondente a un JSP nella directory di lavoro sotto Tomcat.

Sembra che, che ti piaccia o no, se invochi un JSP da un servlet, JSESSIONIDverrà creato!

Aggiunto: ho appena scoperto che aggiungendo la seguente direttiva JSP:

<%@ page session="false" %>

è possibile disabilitare l'impostazione di JSESSIONIDtramite un JSP.


3
In altre parole: il valore predefinito per l'attributo della sessione di pagina è "true". Quale potrebbe essere inaspettato in alcuni (molti?) Casi.
David Balažic,

Sono anche su Tomcat e non uso affatto jsp, ma il cookie di sessione viene comunque creato. Qualche idea su come prevenirlo in questa situazione?
ClassyPimp

23

CORREZIONE: si prega di votare per la risposta di Peter Štibraný - è più corretta e completa!

Un "JSESSIONID" è l'ID univoco della sessione http: vedere javadoc qui . Lì troverai la seguente frase

Le informazioni sulla sessione sono incluse solo nell'applicazione Web corrente (ServletContext), quindi le informazioni memorizzate in un contesto non saranno direttamente visibili in un altro.

Pertanto, quando si accede per la prima volta a un sito, viene creata una nuova sessione e associata a SevletContext. Se si distribuiscono più applicazioni, la sessione non è condivisa.

È inoltre possibile invalidare la sessione corrente e quindi crearne una nuova. ad es. quando si passa da http a https (dopo il login), è una buona idea creare una nuova sessione.

Spero che questo risponda alla tua domanda.


1
Chiara spiegazione dell'ambito della sessione.
user3123690

@Mo il collegamento è interrotto
Timofey

8

Fai attenzione se la tua pagina include altri .jsp o .jspf (frammento)! Se non si imposta

<%@ page session="false" %>

anche su di essi, la pagina padre finirà per iniziare una nuova sessione e impostare il cookie JSESSIONID.

In particolare per le pagine .jspf, ciò accade se hai configurato web.xml con un frammento di questo tipo:

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jspf</url-pattern>
    </jsp-property-group>
</jsp-config>

per abilitare gli scriptlet al loro interno.


Intendi set page session = false in tutti i frammenti inclusi (.jsp e .jspf) e non includerlo nel jsp principale che include il resto degli snippet?
Ommadawn,

2

Per i link generati in un JSP con tag personalizzati, ho dovuto usare

<%@ page session="false" %>

nel JSP

E

request.getSession().invalidate();

nell'azione Struts

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.