Session zerstören

F

frageUMantwort

Gast
Hallo miteinander.

Ich möchte gerne eine Session zerstören. Dafür habe ich ein kleines Beispiel erstellt:

// index.jsp
HTML:
<%-- 
    Document   : index
    Created on : 21.07.2011, 10:29:38
    Author     : Administrator
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Beispiel</title>
    </head>
    <body>
        <a href="/BeispielSession/test">Session setzen</a><br>
    </body>
</html>

// Session wird gesetzt ( aufruf siehe index.jsp )
Java:
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class Test extends HttpServlet {
   
    public static HttpSession session = null;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            response.addHeader("Pragma:", "no-cache");
            response.addHeader("Pragma:", "no-store");

            if(session == null){
                session = request.getSession(true);
            }
 
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet Test </title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet Test "+ session.getId() +" </h1>");
            out.println("<a href=\"/BeispielSession/remove\">remove session</a><br>");
            out.println("</body>");
            out.println("</html>");
            
        } finally { 
            out.close();
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 

}

und das Servlet Remove:
Java:
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class Remove extends HttpServlet {
   

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {

            response.addHeader("Pragma:", "no-cache");
            response.addHeader("Pragma:", "no-store");
            response.addHeader("Expires:", new Date().toGMTString());


            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet Remove</title>");  
            out.println("</head>");
            out.println("<body>");

            if(Test.session != null)
                out.println("<h1>Remove Session: " + Test.session.getId() + "</h1>");
            else
                out.println("<h1>Session zerstört</h1>");

            out.println("</body>");
            out.println("</html>");
            Test.session.invalidate();
            Test.session = null;

        } finally { 
            out.close();
        }
    } 

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 
}

Gut, nun wenn die Session gesetzt wird (im TestServlet) und dann anschliessend im RemoveServlet die Session zerstöre. Wird sie auch Erfolgreich "zerstört" allerdings kann der User z. B im Browser die Seite zuvor wieder auswähle ( zrück gehen ). Ich gehe mal stark davon aus der der Browser dann auf den Cache zugreift und deshalb mir nicht anzeigt das die Session zerstört ist. Sobald man die Seite aktualisiert oder wieder auf die Verlinkung zu RemoveServlet geht, wird auch korrekt angezeigt, dass die Session zerstört wird. Weil ja wieder eine Anfrage geschickt wird.
Meine frage ist nun:
  • Wie kann ich dafür sorgen, dass er nicht auf dem Cache zugreift, wenn der User im Browser wieder zurückgeht?
  • Oder wie macht man es in der Praxis? z. B bei Logout, das der User nicht zurück gehen kann und das Formular zuvor doch noch sehen kann?

Dieses Beispiel soll nur zum Verständniss sein, damit ich dann die Möglichkeit kenne wie man so eine Session (die über Servlets gesetzt wurde) zerstört.

Wird in der Praxis dann mehr auf JSP gesetzt und dort die Session gesetzt?

Gruß
 

Tente

Mitglied
Du kannst den Browser nicht dazu zwingen, wenn er in der History zurück geht einen erneuten Request an deinen Server zu schicken, um die Session-Validität zu prüfen. Daher kannst du den Inhalt natürlich sehen. Jede Aktion die er dann jedoch ausführen würde, dürfte dann jedoch auf den Hammer laufen. Gleiches hier im Forum. Meld dich ab und geh im Browser auf "Zurück". Du bist dann wieder scheinbar angemeldet. Aber wenn du dann eine Aktion ausführst bekommt der Server mit, dass du keine valide Session hast und führt nichts aus.

Da du in der Praxis, wenn du mit JSP oder JSF arbeitest eh tendenziell weniger mit eigenen Servlets arbeitest, bietet es sich dann an über JSP oder ManagedBeans die Sessions zu zerstören. Die einfachere Methode ist hierbei eine JSP anzulegen, die aus der Session invalidate() aufruft.
 
Zuletzt bearbeitet:

ARadauer

Top Contributor
Mhn nein das hast du falsch verstanden..

Java:
public class Test extends HttpServlet {
   
    public static HttpSession session = null;
Das darfst du nicht tun. Da würden sich die Benutzer gegenseitig die Session überschreiben. Du musst bei jedem Request die Session aus dem Request hohlen. Da kannst du dann werte rein schreiben. Ausloggen würde so funktionieren...
request.getSession().invalidate();
 
F

frageUMantwort

Gast
Ok, also gibt es keine Möglichkeit mit JSP oder Servlets. Mich wundert es ein wenig, da es ja z. B bei gmx.de oder anderen Seite klappt das wunderbar. Was ja nicht heißen muss das die damit Arbeiten. Dort wird anscheinend mit Timeouts gearbeitet nur meine Kentnisse sind da noch beschränkt.

Du kannst den Browser nicht dazu zwingen, wenn er in der History zurück geht einen erneuten Request an deinen Server zu schicken ...
Ja das mit der erneuten request war mir bewusst, habs leider vergessen zu erwähnen. Aber kann man das Historyback nicht verhindert bzw dem Browser sagen das er die Seite nicht im Cache speichern soll?!?

Oder gibt es evtl. noch anderen Möglichkeiten? (siehe gmx/web/google uvm.)

Aber wenn du dann eine Aktion ausführst bekommt der Server mit das du keine valide Session hast und führt nichts aus.
Jep, das war mir auch bewusst :)
 
F

frageUMantwort

Gast
Mhn nein das hast du falsch verstanden..

Java:
public class Test extends HttpServlet {
   
    public static HttpSession session = null;
Das darfst du nicht tun. Da würden sich die Benutzer gegenseitig die Session überschreiben. Du musst bei jedem Request die Session aus dem Request hohlen. Da kannst du dann werte rein schreiben. Ausloggen würde so funktionieren...
request.getSession().invalidate();

Ah, danke für den Hinweis, sehr dumm von mir.
Mit
Java:
request.getSession().invalidate();
zerstöre ich die Session aber das historyback kann der User trotzdem machen. Gut wenn er dann eine Aktion auf der Seite macht wird sie nicht ausgeführt.
 
F

frageUMantwort

Gast
Danke SlaterB.

Das schaut sehr viel versprechend aus. Habe es im Ansatz im Servlet schon versucht :
Java:
            response.addHeader("Pragma:", "no-cache");
            response.addHeader("Pragma:", "no-store");

Aber wie gesagt im Ansatz versucht :)
Werde euch Berichten sobald ich das mal hinbekommen habe.
 

ARadauer

Top Contributor
Noch als Anmerkung. Das Servlet gibt es nur einmal! 5.000 Benutzer mit 100 gleichzeitigen Requests. Aber das Objekt ist nur einmal da. Achtung man darf nicht mal normale Klassenvariablen im Servlet benutzen (ausser man weiß was man da tut)
 
M

maki

Gast
Speziell beim Backbutton verhalten sich manche Browser etwas seltsam was die "bitte nicht cachen" Sache betrifft.

Zwingen kann man den Browser und das Netzwerk schon, zB. ein Token an die URL hängen dass sich mit jedem Request ändert, damit ist die URL immer anders und damit wird im Cache zu der URL nie etwas gefunden, ist aber unschön imho.

Man kann sich natürlich auch etwas in JavaScript schrieben das auf den Backbutton reagiert und dann eine Meldung ausgibt und verhindert dass der Backbutton wirklich ausgeführt wird.
Ist halt eine Frage wie man die User erzieht, wirklich sauber gelöst hat das ganze Back/History/Navigationszeug imho GWT.

frageUMantwort, bist du sicher dass die Session jemals null ist?
Dürfte m.E. niemals der Falls sein, es sollte eine neue erzeugt werden wenn die alte invalidiert wird.
 
S

SlaterB

Gast
> zB. ein Token an die URL hängen dass sich mit jedem Request ändert, damit ist die URL immer anders

naja, 'Browser back' ist doch in der Regel der Button in der Menüzeile, nicht ein komplett neuer Link auf der Webseite der nur zufällig zu exakt derselben Seite führt
 
M

maki

Gast
Ja, für den Backbutton kann man nur JavaScript nutzen, oder eben sowas wie GWT.

Persönlich habe ich bis GWT nur in Projekten gearbeitet, in denen der Back Button verboten war.
 
F

frageUMantwort

Gast
Noch als Anmerkung. Das Servlet gibt es nur einmal! 5.000 Benutzer mit 100 gleichzeitigen Requests. Aber das Objekt ist nur einmal da. Achtung man darf nicht mal normale Klassenvariablen im Servlet benutzen (ausser man weiß was man da tut)


Danke für den Hinweis. Wenn, dann würde ich nur lokale Variablen verwenden. Hoffe dies wäre dann ein besserer Ansatz? Wobei man nach meinen bisherigen Wissenstand sowenig wie möglich in Servelts macht. Aber ich bin auch seit einer Woche erst dabei mir J2EE anzueignen.

@maki
Stimmt da findet man einiges an Scripts, danke für den Hinweis.
Ok, also Session sollte also niemals null sein, danke :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A (EJB)Session abhängige Parameter in POJO lesen Allgemeines EE 3
O JSF / Primefaces Session handling Allgemeines EE 1
I Session löschen in Bean (Session Beans) Allgemeines EE 1
J Hello World mit Stateless Session Bean - Was mache ich falsch? Allgemeines EE 2
H Shared Session in Webmodulen Allgemeines EE 2
J Unterschied zwischen HttpSession und Stateful Session Bean Allgemeines EE 3
R Wie eine stateful session bean erneut "aufgreifen" Allgemeines EE 22
P Unterschied Session Scope / Stateful Session Bean Allgemeines EE 6
A Im PhaseListener auf Stateful Session Bean zugreifen Allgemeines EE 6
G Session Allgemeines EE 6
E Session Problem Allgemeines EE 9
G Session neu!? Allgemeines EE 7
M Fehler bei Javamail Session mit Glassfish 3 Allgemeines EE 3
Java.getSkill() verbindung / connection in session speichern Allgemeines EE 4
D Frage zum Statefull Session Beans Lebenszyklus Allgemeines EE 3
MQue Session - Cookie Allgemeines EE 27
MQue Session Exception Allgemeines EE 5
M j_security_check Login und Session-ID Allgemeines EE 2
S Session in eine andere Anwendung übergeben Allgemeines EE 2
F Session abgelaufen und direkter Aufruf Allgemeines EE 10
Y myFaces und Hibernate Session Handling Allgemeines EE 7
S tomcat session timeout - und was danach? Allgemeines EE 1
Q Form Based Authentication - Session Attribute ? Allgemeines EE 2
A Session Bean mit Local-Interface nutzen Allgemeines EE 3
G Session Cookies Allgemeines EE 2
Q Session Tracking - Wie macht mans richtig! Allgemeines EE 3
B Session Daten pro User merken Allgemeines EE 9
H [JSP JSF] Session Timeout und Redirekt zur Startseite Allgemeines EE 5
I Session-Attribute von Client zugänglich? Allgemeines EE 6
G session token Allgemeines EE 3
K tomcat: session-unabhängiges speichern Allgemeines EE 3
S Struts und Session Allgemeines EE 2
J Tomcat mit eigener Session-Implementierung Allgemeines EE 15
Y JSF - Session Handling Firefox Allgemeines EE 3
Y JSF - Session invalidate bei outpulink möglich? Allgemeines EE 4
R Session Tracking & Cookies Allgemeines EE 3
B Variablen ausserhalb der session ? Allgemeines EE 2
T Zugriff auf Session-Objekte in JSP Allgemeines EE 2
W Session tracking mit URL rewrite - Session weg! Allgemeines EE 4
G Neue Session bei der Verwendung von Frames Allgemeines EE 3
RaoulDuke EJB 3.0 - Exceptions aus Methoden einer Session Bean Allgemeines EE 2
T Session-Problem Allgemeines EE 2
Z Session aufräumen Allgemeines EE 2
G Session Problem Allgemeines EE 5
G JBoss - Session / Entity Allgemeines EE 8
S Bild in Session Allgemeines EE 2
F Session Bean -> Daten aus dem Servlet holen Allgemeines EE 11
P Struts Form Bean vs. Session Variable Allgemeines EE 6
A JSF - Daten in Session speichern Allgemeines EE 2
R Formulareingaben gezielt aus Session löschen Allgemeines EE 4
W Session nach Browserschließung erhalten im Tomcat Allgemeines EE 4
R Vernünftige Session-Verwaltung mit Struts Allgemeines EE 4
Q Tomcat/java-Session-Problem Allgemeines EE 9
L Zwei Browserfenster mit unterschiedlicher session - geht das Allgemeines EE 3
flashfactor Logging in einem Session-Bean Allgemeines EE 2
H JSP, Session und Java-Bean Allgemeines EE 4
P Session Problem Allgemeines EE 17
flashfactor Frage zu Session-Lebensdauer Allgemeines EE 3
J xdoclet session facade + value object Allgemeines EE 2
M Session Bean vers. Entity Bean Allgemeines EE 3
G ResultSet in Session speichern Allgemeines EE 4
P Session Attribute an Klasse übergeben Allgemeines EE 13
G Mit Session-IDs richtig umgehen Allgemeines EE 3
C Mail von einer Session Bean aus senden Allgemeines EE 2
P Session NullPointerException Allgemeines EE 17
H daten in session speichern Allgemeines EE 8
G list in session schreiben Allgemeines EE 4
P String-Array an session Variable übergeben Allgemeines EE 3
P Session Beans importieren Allgemeines EE 2
F Problem mit Session (Weitergabe an andere JSPs) Allgemeines EE 2
Y JSF - einzelne Bean zerstören/ungültig machen Allgemeines EE 2
P Sessions von Hand erstellen und zerstören Allgemeines EE 3

Ähnliche Java Themen

Neue Themen


Oben