Unter welchen Bedingungen wird eine JSESSIONID erstellt?

276

Wann / unter welchen Bedingungen JSESSIONIDwird a erstellt?

Ist es pro Domain? Wenn ich beispielsweise einen Tomcat-App-Server habe und mehrere Webanwendungen bereitstelle, wird JSESSIONIDpro Kontext (Webanwendung) ein anderer erstellt oder wird er von Webanwendungen gemeinsam genutzt, solange sie dieselbe Domäne sind?

joshjdevl
quelle

Antworten:

324

JSESSIONID-Cookie wird beim Erstellen der Sitzung erstellt / gesendet. Die Sitzung wird erstellt, wenn Ihr Code aufruft request.getSession()oder request.getSession(true)zum ersten Mal. Wenn Sie die Sitzung nur abrufen, aber nicht erstellen möchten, wenn sie nicht vorhanden ist, verwenden Sie request.getSession(false)- dies gibt Ihnen eine Sitzung zurück oder null. In diesem Fall wird keine neue Sitzung erstellt und kein JSESSIONID-Cookie gesendet. (Dies bedeutet auch, dass die Sitzung nicht unbedingt auf erste Anfrage erstellt wird . Sie und Ihr Code haben die Kontrolle, wenn die Sitzung erstellt wird.)

Sitzungen sind kontextbezogen:

SRV.7.3 Sitzungsumfang

HttpSession-Objekte müssen auf Anwendungs- (oder Servlet-Kontextebene) einen Gültigkeitsbereich haben. Der zugrunde liegende Mechanismus, wie z. B. das zum Einrichten der Sitzung verwendete Cookie, kann für verschiedene Kontexte gleich sein, das referenzierte Objekt, einschließlich der Attribute in diesem Objekt, darf jedoch vom Container niemals zwischen Kontexten geteilt werden.

( Servlet 2.4-Spezifikation )

Update: Jeder Aufruf der JSP-Seite erstellt implizit eine neue Sitzung, wenn noch keine Sitzung vorhanden ist. Dies kann mit der session='false'Seitenanweisung deaktiviert werden. In diesem Fall ist die Sitzungsvariable auf der JSP-Seite überhaupt nicht verfügbar.

Peter Štibraný
quelle
2
Kann keine Sitzung ohne expliziten Aufruf von getSession erstellt werden? In Bezug auf "darf vom Container niemals zwischen Kontexten geteilt werden" hat websphere die Möglichkeit, Sitzungen zu teilen, was die Motivation für die Frage ist :)
joshjdevl
Nicht, wenn Sie nur die Servlet-API verwenden. Möglicherweise gibt es jedoch serverspezifische Erweiterungen (wie die Sitzungsfreigabe von Websphere, wie Sie hervorheben).
Peter Štibraný
Ich glaube, Ihre context.xml-Datei kann die automatische Sitzungserstellung steuern, wenn Ihr <Context> -Tag ein Cookies-Attribut enthält, z. B. <Context cookies = "false">
BT
Im Moment bekomme ich viele Treffer auf meinen Filter, um eine Sitzung zu erstellen, und es scheint, als würde er erst nach dem zweiten Treffer (keine Aktualisierung der zweiten Seite) erstellt. Dies hat meine Aufmerksamkeit auf "Sitzung wird nicht unbedingt auf erste Anfrage erstellt." es bezog sich? Können Sie ein Beispiel geben, warum dies nicht unbedingt auf erste Anfrage erstellt wird? Vielen Dank!
jpganz18
@ jpganz18: Wenn Sie einfach request.getSession()oder anrufen request.getSession(true), erhalten Sie entweder eine vorhandene oder eine neue Sitzung. Wenn Ihr Code jedoch aufruft request.getSession(false), erhalten Sie entweder eine vorhandene Sitzung oder null, wenn keine Sitzung vorhanden ist.
Peter Štibraný
49

Hier einige Informationen zu einer weiteren Quelle des JSESSIONIDCookies:

Ich habe gerade Java-Code debuggt, der auf einem Tomcat-Server ausgeführt wird. Ich habe request.getSession()nirgendwo in meinem Code explizit angerufen, aber ich habe festgestellt, dass noch ein JSESSIONIDCookie gesetzt wird.

Schließlich habe ich mir den generierten Java-Code angesehen, der einer JSP im Arbeitsverzeichnis unter Tomcat entspricht.

Es scheint, dass, ob Sie es mögen oder nicht, wenn Sie eine JSP von einem Servlet aufrufen, JSESSIONID , erstellt wird!

Hinzugefügt: Ich habe das gerade durch Hinzufügen der folgenden JSP-Direktive gefunden:

<%@ page session="false" %>

Sie können die Einstellung JSESSIONIDdurch eine JSP deaktivieren .

Rangachari Anand
quelle
3
Mit anderen Worten: Der Standardwert für das Seitensitzungsattribut ist "true". Was in einigen (vielen?) Fällen unerwartet sein kann.
David Balažic
Ich bin auch auf Tomcat und verwende jsp überhaupt nicht, aber das Sitzungscookie wird trotzdem erstellt. Irgendeine Idee, wie man es in dieser Situation verhindern kann?
ClassyPimp
23

KORREKTUR: Bitte stimmen Sie für die Antwort von Peter Štibraný - sie ist korrekter und vollständiger!

Eine "JSESSIONID" ist die eindeutige ID der http-Sitzung - siehe Javadoc hier . Dort finden Sie den folgenden Satz

Sitzungsinformationen gelten nur für die aktuelle Webanwendung (ServletContext), sodass in einem Kontext gespeicherte Informationen in einem anderen nicht direkt sichtbar sind.

Wenn Sie also zum ersten Mal eine Site aufrufen, wird eine neue Sitzung erstellt und an den SevletContext gebunden. Wenn Sie mehrere Anwendungen bereitstellen, wird die Sitzung nicht freigegeben.

Sie können auch die aktuelle Sitzung ungültig machen und daher eine neue erstellen. Wenn Sie beispielsweise von http zu https wechseln (nach dem Anmelden), ist es eine sehr gute Idee, eine neue Sitzung zu erstellen.

Hoffe, das beantwortet deine Frage.

Mo.
quelle
1
Klare Erklärung des Sitzungsumfangs.
user3123690
@ Mo der Link ist kaputt
Timofey
8

Passen Sie auf, wenn Ihre Seite andere .jsp oder .jspf (Fragment) enthält! Wenn Sie nicht einstellen

<%@ page session="false" %>

Auch auf ihnen startet die übergeordnete Seite eine neue Sitzung und setzt das JSESSIONID-Cookie.

Dies gilt insbesondere für .jspf-Seiten, wenn Sie Ihre web.xml mit einem solchen Snippet konfiguriert haben:

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

um Scriptlets in ihnen zu aktivieren.

Polaretto
quelle
Meinen Sie set page session = false in allen enthaltenen Fragmenten (.jsp und .jspf) und nicht in den Haupt-jsp, der den Rest der Snippets enthält?
Ommadawn
2

Für Links, die in einer JSP mit benutzerdefinierten Tags generiert wurden, musste ich verwenden

<%@ page session="false" %>

in der JSP

UND

request.getSession().invalidate();

in der Struts-Aktion

Jerome Jaglale
quelle