Servlet Bei jedem Request wird eine neue Session erstellt.

Bitte aktiviere JavaScript!
Hallo,

seit langem versuche ich ein hartnäckiges Problem zu lösen und hatte es zeitweise beeits aufgegeben, da ich auch nach intensivem Suchen im Netz keine Lösung gefunden habe.

Folgendes: Ich betreibe seit vielen Jahren ein Webanwendung, welche unter Tomcat 6 und JVM 1.6 wunderbar läuft (Konfiguration 1).

Da der Platz auf dem Server mittlerweile eng wird und die Performance auch schwächelt möchte ich gerne innerhalb des Server-Anbieters umziehen. Auf dem neuen Server wird dann Tomcat 8 mit einer JVM 1.7 arbeiten (Konfiguration 2).

Jetzt passiert es aber, dass exakt die gleiche Anwendung, welche unter Tomcat 6 mit JVM 1.6 problemlos läuft, auf dem neuen Server nicht mehr funktioniert.

Bei der Fehleranalyse habe ich festgestellt, dass bei jedem Request eine neue Session erstellt wird, was natürlich die Benutzung der Webanwendung unmöglich macht!

Ich kann das Verhalten der Anwendung unter beiden Konfigurationen auf meinem Rechner mit dem Debugger von Netbeans wunderbar reproduzieren.

Natürlich habe ich für jede Konfiguration einen eigenen Build angestoßen...

Mir scheint, dass es irgendeine nötige Veränderung in der Konfiguration von Tomcat geben muss, die ich aber leider nicht kenne.

Hat jemand eine Idee?

Vielen Dank im voraus, Jann
 
Vielleicht ist es der Session-Timeout. Den setzt man normalerweise in der web.xml und wenn der da nicht gesetzt wurde, dann wird der Default-Wert verwendet. Bei Tomcat is der glaube ich hier: CATALINA_BASE/conf/web.xml

Cheers,
Andy
 
Hallo Andy,
vielen Dank für die Antwort. Leider scheint die Lösung nicht so trivial. Die Anwendung läuft ja unter der Konfiguration 1 wie erwartet bzw. das Sessionmanagement läuft Lehrbuchmäßig. Nur unter Konfiguration 2 eben nicht.

Ich habe den Umzug mittlerweile weit über ein Jahr vor mich hergeschoben, weil ich keine Lösung gefunden hatte. Gestern Abend habe ich aber einen Lösungsansatz auf stackoverflow.com gefunden, der bei einem ersten Test anscheinend zur Lösung führt.
Bei dem Ansatz wird die JSESSIONID aus dem Request gelesen und dann in die Response gegeben. Klingt unsinnig funktioniert aber. Mit etwas debuggen konnte ich nämlich feststellen, dass unter Konfiguration 2 die JSESSIONID nicht automatisch im Browser als Cookie abgelegt wurde, was natürlich zu meinen Problemen geführt hat.
Hier der Link: https://stackoverflow.com/a/35054198

Und das ist der Code, der nach der Anmeldung in die Anwendung die JSESSIONID in die Response schreibt und damit auch im Browser:

Java:
HttpSession session = request.getSession();
if (request.getParameter("JSESSIONID") != null) {
    Cookie userCookie = new Cookie("JSESSIONID", request.getParameter("JSESSIONID"));
    response.addCookie(userCookie);
} else {
    String sessionId = session.getId();
    Cookie userCookie = new Cookie("JSESSIONID", sessionId);
    response.addCookie(userCookie);
}
Mich wundert allerdings immer noch warum das Problem anscheinend nicht bei vielen Leuten auftritt - und vor allem warum es überhaupt auftritt...
 
Der Fehler muss ja nicht unbedingt beim Tomcat liegen, sondern kann auch vom Browser verursacht werden. Schau dir mal das an: https://www.wiztools.org/
Da kannst du dir den WizTools REST-Client runterladen. Anders als der Name annehmen laesst, kannst du damit jede Art Request zusammenbauen und an deinen Server senden - und hast die volle Kontrolle ueber alle Aspekte. Die Antwort ist ebenso ausfuehrlich. Vielleicht kannst du damit die Fehlerursache eingrenzen.

Cheers,
Andy
 
Hallo Andy,
es hat nun etwas gedauert mit meiner Antwort...
Den Grund für dieses Verhalten konnte ich nicht finden aber es tritt bei verschiedenen Browsern auf unterschiedlichen Rechnern und Betriebssystemen auf. Wo früher automatisch eine neue SessionID erstellt und im Browser abgelegt wurde, muss ich es unter der Konfiguration 2 wirklich explizit machen, so wie im Codebeispiel dargestellt.
Ich habe diese Funktion jetzt an zentraler Stelle im Controller der Anwendung installiert und werde es jetzt so lassen. Vielleicht läuft mir irgendwann ja mal eine Erklärung über den Weg ;-)
Vielen Dank! Jann
 
Im Jahr 2000 habe ich mal an einer ganz einfachen Web-Applikation mit JSP und Servlet mitgearbeitet.

Dort mussten wir allen Links die JSESSIONID als Parameter mitgeben.

In Forms wurde dafür ein hidden-Field verwendet.
 
Hallo Barista,

ja, das kann man machen. Mein Problem ist aber ein anderes...
Jetzt habe ich aber eine Lösung gefunden (sh. Codebeispiel) - zwar nicht so ganz befriedigend, da ich die Ursache für das Nichtsetzen der JSESSIONID nicht kenne aber es funktioniert.

Gruß, Jann
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben