2010-01-26 5 views
21

Ich habe dieses große Problem. Meine aktuelle Sitzung ist jedes Mal beendet, wenn ich eine neue Anfrage an den Server gestellt habe.Sitzung ist verloren und neu erstellt in jeder Servlet-Anfrage

Ich habe an vielen Orten eingecheckt. Ich kann nicht finden, was das Problem ist. Ich habe auch session-config in web.xml sowohl in Tomcat und Anwendung. Ich habe auch Cookies in meinem Browser akzeptiert. Getestet in jedem Browser. Es funktioniert nicht.

Ich entwickle gerade eine einfache Java ee Anwendung mit JSP/Servlet. Ich bin mit dem Problem nur konfrontiert, nachdem ich auf Tomcat in Server-Maschine eingesetzt habe.

+0

Simial Frage: http://Stackoverflow.com/q/13461838/698168 –

Antwort

4

Nach Jahren habe ich die Antwort nie wieder hier gepostet. Zu dieser Zeit war ich beschäftigt und vergaß diese Frage. Aber heute suche ich wie immer in Stackoverflow nach einer Lösung und sehe in dieser Benachrichtigung, dass ich Punkte von dieser Frage bekomme. Es scheint, als ob andere Entwickler mit dem gleichen Problem konfrontiert sind. Also versuchte ich mich zu erinnern, wie ich das Problem gelöst habe.Und ja, ich habe gelöst, indem ich die Sitzungs-ID manuell zurücksetzte, um die Sitzungs-ID zu verfolgen/zu verwalten.

Bitte beachten Sie den Code, den ich jsessionid manuell in das Servlet zurückstellen.

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); 
} 
3

Versuchen Sie, firefox die Live Http Headers plugin hinzuzufügen, und stellen Sie sicher, dass der Sitzungscookie tatsächlich vom Server an den Browser übergeben wird, und stellen Sie sicher, dass der Browser ihn bei der nächsten Anfrage erneut sendet.

+2

oder FireBug (http://getfirebug.com/) – Bozho

+0

Aber, wie? Ich habe Sitzungen in vielen Projekten verwendet. Ich habe dieses Problem niemals angegangen. Können Sie mir bitte sagen, wie ich es an den Browser zurücksende? Es passiert nicht nur in Firefox, es passiert auch in den anderen Browsern. –

+1

Ich sage nicht, dass es browser-bezogen ist, aber das Plugin ermöglicht es Ihnen, zu sehen, dass der Cookie hin- und hergereicht wird (oder nicht, je nachdem). Es wird dir nicht sagen * warum *, aber es kann dir sagen * was *. – skaffman

3

Überprüfen Sie bitte, ob die Sitzung in Ihrem Code nicht ungültig ist. Suchen Sie nach Code ähnlich request.getSession().invalidate();

+0

Ich habe bereits überprüft. Eigentlich funktioniert es gut auf meinem Rechner, der ein Entwicklungscomputer ist, aber auf dem Server –

+0

In diesem Fall gibt es offensichtlich einen Unterschied in der Konfiguration zwischen Ihrem Dev-Server und Ihrem Live-Server. Fügen Sie die von Ihnen geänderten web.xml-Snippets zu Ihrer Frage hinzu. –

3

Prüfen Sie zunächst, ob die Webapp des context.xml tut nicht haben cookies="false" konfiguriert.

Weiterhin ist es gut zu wissen, dass Cookies abhängig von Domain, Port und Contextpath sind. Wenn die Links auf der Seite auf eine andere Domäne, einen Port und/oder einen Kontextpfad im Gegensatz zur aktuellen Anforderungs-URL (die in der Adressleiste des Browsers angezeigt wird) zeigen, wird der Cookie nicht durchgelassen dass die Sitzung nicht mehr identifiziert werden kann und Sie eine neue vom Servletcontainer erhalten.

Wenn das nicht die Ursache ist, dann prüfen Sie, ob Sie nicht eine Umleitung auf jede Anfrage mit HttpServletResponse.sendRedirect() aus irgendeinem Grunde tun. Wenn Sie dies bereits bei der ersten Anfrage tun, geht der Cookie verloren. Sie werden

response.sendRedirect(url); 

von

response.sendRedirect(response.encodeRedirectURL(url)); 
+0

Ich benutze Forward ... –

29

Einer möglichen Ursache für diese einen „nackten“ Hostnamen (d einen ohne Domänenteil) ersetzen müssen. Das ist ziemlich üblich, wenn Sie in einem Intranet arbeiten.

Das Problem ist, dass fast alle Browser-Cookies keine Cookies für Hostnamen ohne Domänennamen akzeptieren. Dies wurde gemacht, um zu verhindern, dass evilsite.com ein Cookie für com setzt (was schlimm wäre, da es das ultimative Tracking-Cookie wäre).

Wenn Sie also über http://examplehost/ auf Ihre Anwendung zugreifen, wird kein Cookie akzeptiert, während für http://examplehost.localdomain/ das Cookie akzeptiert und zurückgegeben wird.

Das Schlechte daran ist, dass der Server nicht unterscheiden kann zwischen "der Browser hat das Cookie bekommen und es ignoriert" und "der Browser hat das Cookie nie bekommen". So wird jeder einzelne Zugriff für den Server wie eine komplett neue Sichtweise aussehen.

+0

Ich habe bereits mit der Anwendung selbst auf dem Server mit localhost getestet. Es verursacht das gleiche issuse. In diesem Projekt verwende ich Jersey REST-Service, JCaptcha und benutzerdefinierte Tag. –

+0

Was sehr seltsam ist, habe ich Glassfish auf dem Server installiert und die Anwendung auf dem Glassfish bereitstellen. Immer noch das gleiche Problem ... Ich bin völlig verloren. –

+0

Ich habe meinen Maschinenlink-Namen von IP zu machinene.localdomain geändert und mein Problem wurde gelöst !. Danke – jcrada

0

Bearbeiten Sie Ihre tomcat context.xml Datei und <Context> Tag <Context useHttpOnly="false"> ersetzen, das hat mir geholfen.

2

Ich erleben einen abgestanden https Session-Cookie (mein Ad-hoc-term) Problem, aufgrund einer sicheren Flagge.

Ich hatte dieses Problem beim Wechsel zwischen http und https. Der Cookie, der von der https-Sitzung gespeichert wurde, wurde nie von der http-Sitzung überschrieben. Es blieb in FireFox Erinnerung für die Ewigkeit. Es war sichtbar in FireFox Werkzeuge/Optionen/Datenschutz/Löschen Sie einzelne Cookies wo in Senden Sie für Feld war es Nur für sichere Verbindungen. Das Löschen dieses einzelnen Cookies oder aller Cookies ist eine Umgehungslösung.

Ich war das Debuggen, das Problem mit wget, und ich bemerkte einen solchen Header:

Set-Cookie: JSESSIONID=547ddffae0e5c0e2d1d3ef21906f; Path=/myapp; Secure; HttpOnly 

Das Wort sicher dieses abgestandene Cookie nur in https-Verbindungen und erstellt wird angezeigt. Es ist ein SecureFlag (siehe OWASP). Es gibt Möglichkeiten, dieses Flag auf der Serverseite zu deaktivieren, was wie eine dauerhafte Lösung aussieht, aber möglicherweise nicht sicher ist.

Oder ist es ein Browserfehler, dass der Cookie nicht überschrieben wird?

0

Wenn eine Lastausgleichskonfiguration vorhanden ist, müssen Sie eine Route im Netzwerk konfigurieren, um Anforderungen auf demselben Server zu speichern. Andernfalls wird jede Anforderung an einen anderen Server gesendet, wodurch das Sitzungsattribut verloren geht.

0

in Ihren Eigenschaften

server.session.cookie.http-only=true 
    server.session.cookie.secure=true 

diese Einstellungen entfernen, wird sie Ihre Session-ID-Cookie, behalten, die mit jeder Anfrage zurückgesetzt zu werden wird.

Verwandte Themen