Sessionmanagement und Tomcat

Hallo an alle,

ich habe ein kleines Problem beim Sessionmanagement mit Tomcat das ich nicht verstehe. Ich habe eine Applikation mit Java Server Pages und Servlets geschrieben. Am Anfang muß sich der benutzer anmelden, eine Session wird initiert. Am Anfang jeder jsp und jedes Servlets frage ich die Gültigkeit der Session ab um zu verhindern, dass das Programm einen Stacktrace ausgibt wenn die Session abgelaufen ist.
Das funktioniert auch in 99% wunderbar, ich habe jedoch immer wieder Clients, die mittendrin die Session verlieren und dann immer wieder auf die Anmeldeseite zurück kommen.

Hier mein Code:

Dieses Servlet wird vom Login Screen aufgerufen. Am Anfang initiiere ich eine neue Session

Java:
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,	IOException

	{
		RequestDispatcher rd = null;
		// Alte Session löschen
		try
		{
			request.getSession(false).invalidate();
			request.getSession(true);
		} catch (RuntimeException e)
		{
			rd = this.getServletContext().getRequestDispatcher("/b/noCoockie.html"); //$NON-NLS-1$ //$NON-NLS-2$
			rd.forward(request, response);
			return;
		}
		System.out.println("ID: " + request.getSession(false).getId());
		
		//Weiterer Code zur Validierung des Login
	}


Jede jsp Seite enthält am Anfang diesen Teil

Java:
<head>
<jsp:include page="../layout/sessionexpired.jsp" />


Dies ist dann die Datei sessionexpired.jsp
Java:
<%
	if (!request.isRequestedSessionIdValid())
	{
		out.println("<meta http-equiv='refresh' content='0; URL=/ipk/sessionexpired.html'>");
		out.flush();

	}
%>


Bei Servlets sieht es so aus

Java:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
	// Gültigkeit der Session abfragen und ggf. auf die Anmeldeseite zurück
	RequestDispatcher rd = this.getServletContext().getRequestDispatcher("/sessionexpired.html");
	if (!request.isRequestedSessionIdValid())
	{
		rd.forward(request, response);
		return;
	}

Wer hat eine Idee was ich hier falsch mache. Wie gesagt, der Fehler tritt nur sporadisch und nicht nachvollziehbar auf. Mit dem betroffenen Client hat man dann auch keine Chance mehr weiterzuarbeiten. Er wird immer wieder auf die Loginseite zurück geleitet. Provozieren kann ich das Verhalten in dem ich am Client das Session Cookie lösche.

Vielen Dank

Richard Wimmer
 
Danke für Die Antwort. Das kann es aber nicht sein. Das Sessiontimeout setzte ich weiter unten im Servlet.
Java:
if (benutzer.getKn_rechte() > 0)
{
	// Sessiontimeout für interne Benutzer auf 2 Stunde setzen
	request.getSession().setMaxInactiveInterval(7200);
} else
{
	// Sessiontimeout für externe Benutzer auf 1/2 Stunde setzen
	request.getSession().setMaxInactiveInterval(1800);
}

Es ist auch nicht so, dass der Anwender einmal rausgeschmissen wird und nach einem erneuten Einloggen sofort wieder weiter arbeiten kann. Er wird dann immer wieder unmittelbar bei der nächsten Prüfung der Gültigkeit der Session rausgeschmissen.
 
M

maki

Gast
HTML:
<%
    if (!request.isRequestedSessionIdValid())
    {
        out.println("<meta http-equiv='refresh' content='0; URL=/ipk/sessionexpired.html'>");
        out.flush();
 
    }
%>
Das wird imho nciht zuverlässig funktionieren, wenn schon content gesendet wurde wie zB. beim templating, wird der neue Header ignoriert im besten Falle, im schlechtesten Falle gibt es einen Fehler.
Sowas macht man doch normalerweise mit einem Filter, Beispiele gibt es genug im Netz wenn man nach "Session Filter" etc. sucht.
 
Vielen Dank für den tollen Tip. Hat eine Zeit gedauert, bis ich das mit den Filtern kappiert habe, jetzt läuft es aber wunderbar. Habe aber noch einige Fragen. Kommt mein Fehler nur aus der Sessionprüfung in den jsp dateien oder sollte ich die Sessionprüfung im Servlet besser auch auf die Filter umstellen. Habe meinen Filter jetzt wie folgt implemetiert:
Java:
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,
			ServletException
	{
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) res;
		String url = request.getServletPath();
		System.out.println("url: " + url);
		boolean allowedRequest = false;
		if (urlList.contains(url))
		{
			allowedRequest = true;
		}
		
		String fileType = url.substring(url.indexOf(".")+1);
		//System.out.println("fileType: " + fileType);
		if (typeList.contains(fileType))
		{
			allowedRequest = true;
		}

		
		if (!allowedRequest)
		{
			System.out.println("Check Session");
			HttpSession session = request.getSession(false);
			if (null == session)
			{
				//System.out.println("Session expired");
				response.sendRedirect("/ipk/sessionexpired.html");
			}
		}
		chain.doFilter(req, res);
	}

	public void init(FilterConfig config) throws ServletException
	{
		String urls = config.getInitParameter("avoid-urls");
		StringTokenizer token = new StringTokenizer(urls, ",");
		urlList = new ArrayList<String>();
		while (token.hasMoreTokens())
		{
			urlList.add(token.nextToken());
		}
		String types = config.getInitParameter("avoid-types");
		token = new StringTokenizer(types, ",");
		typeList = new ArrayList<String>();
		while (token.hasMoreTokens())
		{
			typeList.add(token.nextToken());
		}
		/*for (String s : typeList)
		{
			System.out.println(s);
		}*/
	}
Immer wenn der Fall Session expired eintritt wir der Benutzer auch auf die Seite sessionexpired.html umgeleitet. In der Console bekomme ich dann aber folgende Fehlermeldung:
Code:
url: /b/start-d.jsp
Check Session
16.06.2011 11:19:54 org.apache.jasper.runtime.JspFactoryImpl internalGetPageContext
SCHWERWIEGEND: Exception initializing page context
java.lang.IllegalStateException: Cannot create a session after the response has been committed
	at org.apache.catalina.connector.Request.doGetSession(Request.java:2221)
Wo kommt das her?
 
M

maki

Gast
Nun ja, er kann keine neue Session erzeugen wenn der Respone schon committed wurde, steht zumindest so in der Fehlermeldung ;)

Macht aber Sinn, die Session muss entweder als Cookie oder URL Encoded zum Client gesendet werden, das geht halt nicht mehr wenn der Client die Seite schon ausgeliefert bekommen hat.

Du musst imho schon vorher eine neue Session erzeugen.

Sessions werden übrigens immer vom ServletContainer an Clients vergeben, auch bevor sie sich authentifiziert/autorisiert haben, irgendwie muss der Server den Client ja erkennen können ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Tomcat Application Path bestimmen Allgemeines EE 0
TheWhiteShadow JSF plugins für tomcat webapp Allgemeines EE 0
X Tomcat checkParachute Allgemeines EE 3
C Servlet Tomcat/Jersey findet REST-Service nicht Allgemeines EE 3
J Global JNDI Tomcat Allgemeines EE 0
N WebService WAR-File auf Tomcat-Server Allgemeines EE 1
C WebSocket in Tomcat wirft 404 Allgemeines EE 0
S Eclipse mit Tomcat und Jersey Allgemeines EE 7
S Fehlersuche in Eclipse/Tomcat -> Error-log?? Allgemeines EE 2
S Tomcat und 404 -> von jetzt auf gleich Allgemeines EE 4
L JNDI auf Tomcat mit EE Allgemeines EE 4
E Servlet Tomcat Method Signature Resolution Allgemeines EE 7
J Logging und Monitoring unter Tomcat Allgemeines EE 2
aze Tomcat:Error Pages werden nicht angezeigt Allgemeines EE 4
D JSF JSF 2.0 + ICEFaces + Tomcat 7 Allgemeines EE 3
W Tomcat Support mit SLA? Allgemeines EE 3
P Tomcat lädt falsche Datei obwohl richtig angegeben Allgemeines EE 11
N Tomcat funktioniert nach shutdown/startup nicht mehr korrekt Allgemeines EE 9
B Tomcat, JNDI und datasource - Konfiguartion Allgemeines EE 2
JimPanse Tomcat Fehler nach redeploy Allgemeines EE 5
A Java Tomcat findet Website nicht Allgemeines EE 8
S Anfängerfrage Eclipse/Tomcat Allgemeines EE 4
H Installer für Tomcat-Anwendung Allgemeines EE 5
A Tomcat in Eclipse Allgemeines EE 11
T Tomcat: Sessions bleiben zu lange erhalten Allgemeines EE 13
C Tomcat Zugriff auf lokale Dateien Allgemeines EE 2
A Tomcat, Exceptions beim redeploy Allgemeines EE 4
P Hilfe: Tomcat periodischer Absturz Allgemeines EE 5
MQue Tomcat reload Allgemeines EE 4
neurox Tomcat stoppen Allgemeines EE 1
S Unterschied zwischen Tomcat und Application Server? Allgemeines EE 3
MQue Tomcat PermGen Allgemeines EE 7
MQue Tomcat Methodenaufruf Allgemeines EE 3
P Eclipse Tomcat Plugin funktioniert nicht mit externem TC-Server? Allgemeines EE 4
MQue TCP- Verbindung nach Tomcat- Start (global) starten Allgemeines EE 4
reibi Tomcat Proxy eintragen Allgemeines EE 2
P CXF Project auf Tomcat laufen lassen - wie? Allgemeines EE 35
R (TOMCAT] Installation Tomcat auf WinXP Allgemeines EE 8
S Tomcat + Eclipse Allgemeines EE 6
T Security Manager in Tomcat Allgemeines EE 2
S Unterschiedliche Pfade bei Tomcat Allgemeines EE 4
ps EJB3 in Tomcat. das hat selbst mich erstaunt Allgemeines EE 18
B Tomcat Manager - .war Datei hochladen. Einfache Frage Allgemeines EE 5
G Probleme im Tomcat - loading WebappClassLoader Allgemeines EE 3
O ApplicationServer vs. Tomcat Allgemeines EE 5
G Verbindung zu Tomcat Allgemeines EE 15
B Tomcat -> Funktions User Credentials hinterlegen Allgemeines EE 7
B fmt:setBundle => Wo liegt die Properties-Datei im Tomcat? Allgemeines EE 3
U Tomcat Compilierproblem Allgemeines EE 2
A Tomcat -- JSP: komisches Problem Allgemeines EE 11
W Speicher-Problem bei WebApp unter Tomcat, Struts, Hibernate Allgemeines EE 3
M Gelegentlicher Absturz Tomcat Anwendung: PermGen Space Allgemeines EE 6
R Error ServletContextListener auf Tomcat 6 Allgemeines EE 2
Y myFaces 1.2 und Tomcat 5.x / 6.0 Allgemeines EE 9
S tomcat session timeout - und was danach? Allgemeines EE 1
A Tomcat startet nicht, Einstellungsfehler? Allgemeines EE 3
S Auf Datei ausserhalb des Tomcat zugreifen Allgemeines EE 4
S JSP / Tomcat / Eclipse / Unable to compile class for JSP Allgemeines EE 4
E JBoss mit existierendem Tomcat nutzen? Allgemeines EE 4
M JSP: Tomcat: Serverfehler 500 nur beim IE. Allgemeines EE 2
G JSF 1.2 unter Netbeans 6 mit Tomcat 6.0 ->Navigationsprob Allgemeines EE 6
O eclipse - tomcat: Problem bei einfachem Webservice Allgemeines EE 16
L Tomcat Service mit JPDA debugging starten Allgemeines EE 2
J Tomcat: "Unable to get connection, DataSource invalid&q Allgemeines EE 8
A web.xml für Servlet in Tomcat 5.5 erstellen Allgemeines EE 2
F Tomcat: zentraler Class-Ordner? Allgemeines EE 2
A web.xml für Servlet in Tomcat erstellen Allgemeines EE 6
T Tomcat: JNDI + JDBC Problem Allgemeines EE 3
N Zugriff auf Webapp nur für localhost definieren (Tomcat) Allgemeines EE 2
byte Tomcat Deployment Problem (HTTP Status 503) Allgemeines EE 8
H Tomcat, MySQL Allgemeines EE 4
B tomcat verbergen Allgemeines EE 3
M classNotFoundexception vom tomcat Allgemeines EE 10
B Liferay + Tomcat Allgemeines EE 4
K tomcat: session-unabhängiges speichern Allgemeines EE 3
G Tomcat übersetzt nichts mehr Allgemeines EE 6
M tomcat beim booten mit starten Allgemeines EE 4
F Serverdienst in Tomcat implementieren Allgemeines EE 14
J Tomcat mit eigener Session-Implementierung Allgemeines EE 15
V tomcat 6 webserver oder was ist sein Sinn? Allgemeines EE 3
G eigener Tomcat-Connector f. propiet. Protokoll via TCP/IP Allgemeines EE 2
J wsdl-tomcat-AXIS Allgemeines EE 2
G Tomcat unter Eclipse starten Allgemeines EE 9
F Tomcat mit 128 MB Ram Allgemeines EE 9
C Unable to query Tomcat Manager: couldn't connect to host Allgemeines EE 2
A Cronjob mit Tomcat starten ? Allgemeines EE 4
B Connection Poll ohne TomCat Allgemeines EE 5
N Tomcat GWT-Anwendung - An beliebiger Stelle schreiben Allgemeines EE 2
E Tomcat Einstellungen Allgemeines EE 10
B Servlet-Api.jar auf JBoss? (Migration von Tomcat zu JBoss) Allgemeines EE 4
H Eine kurze Verständnisfrage zum Tomcat Allgemeines EE 2
S Hibernate, Tomcat und Eclipse treiben mich zum Wahnsinn. Allgemeines EE 2
F webanwendung läuft nicht auf Tomcat Allgemeines EE 2
M Tomcat, Hibernate, MySQL und die EOFException Allgemeines EE 7
Y Tomcat Thread-Handling Allgemeines EE 2
K Tomcat als Client nutzen Allgemeines EE 2
L Tomcat auf Windows Server 2003 Allgemeines EE 10
T Sysdeo Eclipse Tomcat Plug-in Allgemeines EE 4
H Tomcat in jbuilder mit startup.bat starten Allgemeines EE 5
P Tomcat Servlet POST Daten als Array Allgemeines EE 2

Ähnliche Java Themen

Neue Themen


Oben