it-swarm.com.de

Kann ich die HttpSession in web.xml deaktivieren?

Ich möchte die HttpSession vollständig entfernen - kann ich das in web.xml? Ich bin sicher, es gibt Container-spezifische Möglichkeiten, dies zu tun.

P.S. Ist das eine schlechte Idee? Ich bevorzuge es, Dinge vollständig zu deaktivieren, bis ich sie wirklich brauche.

50
les2

Ich möchte die HttpSession vollständig entfernen

Sie können es nicht vollständig deaktivieren. Alles, was Sie tun müssen, ist, einfach not zu verwenden, um von request.getSession() oder request.getSession(true) an einer beliebigen Stelle im Code Ihrer Webapplikation einen Zugriff darauf zu erhalten. Stellen Sie sicher, dass Ihre JSPs dies nicht implizit tun, indem Sie <%@page session="false"%> einstellen.

Wenn es Ihr Hauptanliegen ist, das Cookie, das hinter den Kulissen von HttpSession verwendet wurde, tatsächlich zu deaktivieren, können Sie dies in Java EE 5/Servlet 2.5 nur in der serverspezifischen Webapp-Konfiguration tun. In Tomcat können Sie beispielsweise das cookies-Attribut im <Context>-Element auf false setzen.

<Context cookies="false">

Siehe auch diese Tomcat-spezifische Dokumentation . Auf diese Weise wird die Sitzung in den nachfolgenden Anforderungen nicht beibehalten, die nicht mit einer URL überschrieben wurden - nur, wenn Sie sie aus irgendeinem Grund aus der Anforderung herausholen. Wenn Sie es nicht brauchen, nur nicht packen, wird es überhaupt nicht erstellt/beibehalten.

Oder wenn Sie bereits Java EE 6/Servlet 3.0 oder neuer verwenden und dies wirklich über web.xml tun möchten, können Sie das neue <cookie-config>-Element in web.xml wie folgt verwenden, um das maximale Alter auf Null zu setzen:

<session-config>
    <session-timeout>1</session-timeout>
    <cookie-config>
        <max-age>0</max-age>
    </cookie-config>
</session-config>

Wenn Sie in Ihrer Webapplikation so hartcodieren möchten, dass getSession() niemals eine HttpSession (oder eine "leere" HttpSession) zurückgibt, müssen Sie einen Filter erstellen, der einen url-pattern von /* überwacht, der die HttpServletRequest durch eine HttpServletRequestWrapper ersetzt. Implementierung, die bei allen getSession()-Methoden null zurückgegeben wird, oder einer benutzerdefinierten Dummy-HttpSession-Implementierung, die nichts tut oder sogar UnsupportedOperationException wirft.

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    chain.doFilter(new HttpServletRequestWrapper((HttpServletRequest) request) {
        @Override
        public HttpSession getSession() {
            return null;
        }
        @Override
        public HttpSession getSession(boolean create) {
            return null;
        }
    }, response);
}

P.S. Ist das eine schlechte Idee? Ich bevorzuge es, Dinge vollständig zu deaktivieren, bis ich sie wirklich brauche.

Wenn Sie sie nicht brauchen, verwenden Sie sie einfach nicht. Das ist alles. Ja wirklich :)

69
BalusC

Wenn Sie eine zustandslose Hochlastanwendung erstellen, können Sie die Verwendung von Cookies für die Sitzungsverfolgung wie folgt deaktivieren (nicht aufdringlich, wahrscheinlich containerunabhängig):

<session-config>
    <tracking-mode>URL</tracking-mode>
</session-config>

Um diese architektonische Entscheidung durchzusetzen, schreiben Sie etwas wie folgt:

public class PreventSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
    throw new IllegalStateException("Session use is forbidden");
}

@Override
public void sessionDestroyed(HttpSessionEvent se) {
    throw new IllegalStateException("Session use is forbidden");
}
}

Fügen Sie es der Datei web.xml hinzu und beheben Sie die Stellen, an denen es mit dieser Ausnahme fehlschlägt:

<listener>
    <listener-class>com.ideas.bucketlist.web.PreventSessionListener</listener-class>
</listener>
7
Dmitrius

Ich verwende die folgende Methode für meine RESTful-App, um versehentliche Sitzungscookies von der Erstellung von und zu entfernen.

<session-config>
    <session-timeout>1</session-timeout>
    <cookie-config>
        <max-age>0</max-age>
    </cookie-config>
</session-config>

HttpSessions wird dadurch jedoch nicht vollständig deaktiviert. Es kann immer noch versehentlich eine Sitzung von der Anwendung erstellt werden, auch wenn sie innerhalb einer Minute nicht mehr angezeigt wird und ein unbefugter Client möglicherweise auch die Anforderung für das Alter für das Cookie ignoriert.

Der Vorteil dieses Ansatzes ist, dass Sie Ihre Anwendung nicht ändern müssen, sondern nur web.xml. Ich würde empfehlen, dass Sie eine HttpSessionListener erstellen, die protokolliert, wenn eine Sitzung erstellt oder gelöscht wird, sodass Sie nachverfolgen können, wann sie auftritt.

4

Ich möchte die HttpSession vollständig entfernen - kann ich das in web.xml? Ich bin mir sicher, dass es Container-spezifische Möglichkeiten gibt

Ich glaube nicht Das Deaktivieren von HttpSession wäre eine Verletzung der Servlet-Spezifikation, die besagt, dass HttpServletRequest#getSession eine Sitzung zurückgeben oder eine erstellen soll. Daher würde ich nicht erwarten, dass ein Java EE-Container eine solche Konfigurationsoption bietet (dies würde dazu führen, dass er nicht kompatibel ist).

Ist das eine schlechte Idee? Ich bevorzuge es, Dinge vollständig zu deaktivieren, bis ich sie wirklich brauche.

Nun, ich verstehe nicht wirklich den Punkt, füge einfach nichts in die Sitzung ein, wenn du es nicht verwenden möchtest. Wenn Sie die Verwendung der Sitzung wirklich verhindern möchten, können Sie die Anforderung durch eine Filter durch eine Implementierung von HttpServletRequestWrapper ersetzen, die getSession() überschreibt. Aber ich würde keine Zeit damit verschwenden, dies zu implementieren :)

Update: Mein ursprünglicher Vorschlag war nicht optimal, der "richtige" (cough) Weg wäre, die Anfrage zu ersetzen.

2
Pascal Thivent

Anstatt die Deaktivierung zu deaktivieren, können Sie die URL mithilfe eines URL-Überschreibungsfilters neu schreiben, z. B. tuckey rewrite filter . Dadurch erhalten Sie freundliche Ergebnisse von Google, ermöglichen jedoch die Behandlung von Cookies auf Sitzungsbasis.

Sie sollten es jedoch wahrscheinlich für alle Antworten deaktivieren, da es schlechter ist als nur die Suchmaschine unfreundlich. Es macht die Sitzungs-ID verfügbar, die für bestimmte Sicherheits-Exploits verwendet werden kann.

Beispiel config für Tuckey-Filter:

<outbound-rule encodefirst="true">
  <name>Strip URL Session ID's</name>
  <from>^(.*?)(?:\;jsessionid=[^\?#]*)?(\?[^#]*)?(#.*)?$</from>
  <to>$1$2$3</to>
</outbound-rule>
2
Pool

In Spring Security 3 mit Java Config können Sie HttpSecurity.sessionManagement () verwenden:

@Override
protected void configure(final HttpSecurity http) throws Exception {
    http
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}

XML sieht so aus;

<http create-session="stateless">
  <!-- config -->
</http>

Übrigens, der Unterschied zwischen NIE und STATELLESS

NEVER: Spring Security erstellt niemals eine HttpSession, verwendet jedoch die HttpSession, falls sie bereits existiert

STATELESS: Spring Security erstellt niemals eine HttpSession und es wird Verwenden Sie es niemals, um den SecurityContext abzurufen

2
Nicholas Lu

Ab Servlet 3.0 können Sie festlegen, dass Sitzungen vom Servlet-Container in keiner Weise nachverfolgt werden, indem Sie der contextInitialized-Methode einer ServletContextListener-Code folgenden Code hinzufügen:

servletContext.setSessionTrackingModes(Collections.emptySet());

Javadoc.

Bei einer RESTful-Anwendung werde ich sie einfach jedes Mal ungültig, wenn der Lebenszyklus der Anforderung endet. Möglicherweise gibt es einen Webserver, der immer dann eine neue Sitzung erstellt, wenn ein neuer Client zugreift, unabhängig davon, ob Sie request.getSession() aufrufen.

1
Wittaya

Man kann die Sitzungserstellung nicht vermeiden. Sie können jedoch am Ende eines Anforderungszyklus prüfen, ob Sie gegen Ihre eigenen Anforderungen verstoßen. Erstellen Sie also einen einfachen Servlet-Filter, den Sie als erstes platzieren und nach chain.doFilter eine Ausnahme auslösen, wenn eine Sitzung erstellt wurde:

chain.doFilter(request, response);
if(request.getSession(false) != null)
    throw new RuntimeException("Somewhere request.getSession() was called");
0
Karussell