Seltsames problem mit session.invalidate()
Habe ich merkwürdige Problem mit dem ein-und ausloggen. Ich habe implementiert die container-basierte Sicherheit. Ich habe Login/Logout-links auf allen meinen Seiten (durch template.xhtml
), die gerendert werden oder nicht, basierend auf der backing-bean boolean-Eigenschaft (es ist wirklich Methode isLoggedIn()
). Auch in der backing-bean habe ich die Methode logout, die die Aktion für den Abmelden-link (es ist h:commandLink
). Logout-Methode gibt String
Umleitung auf die login-Seite durch die implizite JSF-2.0-navigation. Wenn ich jetzt bereitstellen Anwendung, mit der ich stöbern auf meiner Seite zeigt es index.xhtml
. Von dort aus gehe ich auf die login-Seite. Ich legte meinen Benutzernamen/Passwort klicken Sie auf Anmelden und meldet es mir. Aber jetzt habe ich auf Abmelden die Anrufe, die backing-bean-logout-Methode genannt, die genannt bedeutet dies:
public String logout() {
HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
//HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
try {
session.invalidate();
//request.logout();
} catch (Exception ex) {
Logger.getLogger(PostController.class.getName()).log(Level.SEVERE, null, ex);
}
return "/ssl/login?faces-redirect=true";
}
Nun nach einem Klick auf Logout leitet es mich wieder zurück auf die login-Seite, wenn ich wieder mit Benutzername/Kennwort, und klicken Sie auf Login. Aber dann ist etwas seltsames passiert, weil es zeigt mir meine index.xhtml
aber ich bin nicht eingeloggt. Ich gehe wieder auf die login-Seite, geben Sie die Anmeldeinformationen erneut, um endlich angemeldet. Dies geschieht nur, wenn ich session.invalidate()
im backing-bean logout()
Methode. Wenn ich request.logout()
funktioniert alles einwandfrei. Was ist das problem?
Bearbeitet:
isLoggedIn sieht so aus, aber ich glaube nicht, dass es ein problem verursachen, ich erstellte filter, die leitet mich (nur wenn ich eingeloggt bin), index.xhtml, wenn ich versuche, navigieren Sie zu login-Seite. Und es passiert nicht.
public boolean isLoggedIn() {
HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
if(request.getUserPrincipal() != null)
return true;
else
return false;
}
Bearbeitet:
Hier ist das Szenario unter Berücksichtigung http-Header:
Ich bitte login.xhtml:
GET /blog-war/ssl/login.xhtml;jsessionid=edccb9f9a1c5fc77dbd7fc86f55b HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://localhost:8080/blog-war/
Cookie: JSESSIONID=edccb9f9a1c5fc77dbd7fc86f55b
Antwort:
HTTP/1.1 302 Moved Temporarily
X-Powered-By: Servlet/3.0
Server: GlassFish Server Open Source Edition 3.0.1
Location: https://localhost:8181/blog-war/ssl/login.xhtml
Content-Type: text/html;charset=ISO-8859-1
Content-Language: en-GB
Content-Length: 197
Date: Sat, 04 Sep 2010 22:27:47 GMT
Zog vorübergehend der browser macht eine Anfrage:
GET /blog-war/ssl/login.xhtml HTTP/1.1
Host: localhost:8181
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://localhost:8080/blog-war/
Cookie: JSESSIONID=edccb9f9a1c5fc77dbd7fc86f55b
Antwort:
HTTP/1.1 200 OK
X-Powered-By: Servlet/3.0, JSF/2.0
Server: GlassFish Server Open Source Edition 3.0.1
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Content-Type: text/html;charset=UTF-8
Content-Length: 1256
Date: Sat, 04 Sep 2010 22:27:47 GMT
Ich füllen Sie Benutzername/Passwort ein und klicken Sie Login:
POST /blog-war/ssl/j_security_check HTTP/1.1
Host: localhost:8181
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://localhost:8181/blog-war/ssl/login.xhtml
Cookie: JSESSIONID=edccb9f9a1c5fc77dbd7fc86f55b
Antwort:
HTTP/1.1 302 Moved Temporarily
X-Powered-By: Servlet/3.0
Server: GlassFish Server Open Source Edition 3.0.1
Location: https://localhost:8181/blog-war/
Content-Type: text/html;charset=ISO-8859-1
Content-Language: en-GB
Content-Length: 182
Date: Sat, 04 Sep 2010 22:40:01 GMT
Es wurde redirect auf index.xhtml:
GET /blog-war/ HTTP/1.1
Host: localhost:8181
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://localhost:8181/blog-war/ssl/login.xhtml
Cookie: JSESSIONID=edccb9f9a1c5fc77dbd7fc86f55b
Antwort:
HTTP/1.1 302 Moved Temporarily
X-Powered-By: Servlet/3.0
Server: GlassFish Server Open Source Edition 3.0.1
Pragma: No-cache
Cache-Control: no-cache
Expires: Thu, 01 Jan 1970 01:00:00 CET
Location: http://localhost:8080/blog-war/
Content-Type: text/html;charset=ISO-8859-1
Content-Language: en-GB
Content-Length: 181
Date: Sat, 04 Sep 2010 22:40:01 GMT
Wieder umleiten, denn ich habe filter, der switch-zu-https-http-und Umgekehrt (ich wollte nur anmelden.xhtml https):
GET /blog-war/ HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cookie: JSESSIONID=edccb9f9a1c5fc77dbd7fc86f55b
Antwort:
HTTP/1.1 200 OK
X-Powered-By: Servlet/3.0, JSF/2.0
Server: GlassFish Server Open Source Edition 3.0.1
Pragma: no-cache
Cache-Control: no-cache, no-store, must-revalidate
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Content-Type: text/html;charset=UTF-8
Content-Length: 4002
Date: Sat, 04 Sep 2010 22:40:02 GMT
Nun bin ich eingeloggt, erfolgreich, Logout-link bedeutet, dass die backing-bean isLoggedIn gibt true zurück. Jetzt klicke ich auf Abmelden, die Sitzung ruft.invalidate() logout () - Methode in backing-bean:
POST /blog-war/index.xhtml HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://localhost:8080/blog-war/
Cookie: JSESSIONID=edccb9f9a1c5fc77dbd7fc86f55b
Antwort:
HTTP/1.1 302 Moved Temporarily
X-Powered-By: Servlet/3.0, JSF/2.0
Server: GlassFish Server Open Source Edition 3.0.1
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Location: http://localhost:8080/blog-war/ssl/login.xhtml
Content-Type: text/html;charset=ISO-8859-1
Content-Language: en-GB
Content-Length: 196
Date: Sat, 04 Sep 2010 22:48:34 GMT
Redirect auf login Seite logout gibt String "/ssl/login?faces-redirect=true" also gehen wir es:
GET /blog-war/ssl/login.xhtml HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://localhost:8080/blog-war/
Cookie: JSESSIONID=edccb9f9a1c5fc77dbd7fc86f55b
Antwort:
HTTP/1.1 302 Moved Temporarily
X-Powered-By: Servlet/3.0
Server: GlassFish Server Open Source Edition 3.0.1
Location: https://localhost:8181/blog-war/ssl/login.xhtml
Content-Type: text/html;charset=ISO-8859-1
Content-Language: en-GB
Content-Length: 197
Date: Sat, 04 Sep 2010 22:48:34 GMT
Einem weiteren redirect, login-Seite sollte in https (filter arbeitet :)):
GET /blog-war/ssl/login.xhtml HTTP/1.1
Host: localhost:8181
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://localhost:8080/blog-war/
Cookie: JSESSIONID=edccb9f9a1c5fc77dbd7fc86f55b
Antwort:
HTTP/1.1 200 OK
X-Powered-By: Servlet/3.0, JSF/2.0
Server: GlassFish Server Open Source Edition 3.0.1
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: JSESSIONID=eefdcda45337b9c897de2a0e95e3; Path=/blog-war; Secure
Content-Type: text/html;charset=UTF-8
Content-Length: 1256
Date: Sat, 04 Sep 2010 22:48:35 GMT
Dies war also der normale Fluss der Ereignisse. Jetzt abartig:)
Ich bin schon bei der login-Seite, so dass ich erneut ein Benutzername/Kennwort, und klicken Sie auf Login:
POST /blog-war/ssl/j_security_check HTTP/1.1
Host: localhost:8181
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://localhost:8181/blog-war/ssl/login.xhtml
Cookie: JSESSIONID=eefdcda45337b9c897de2a0e95e3
Antwort:
HTTP/1.1 302 Moved Temporarily
X-Powered-By: Servlet/3.0
Server: GlassFish Server Open Source Edition 3.0.1
Location: https://localhost:8181/blog-war/
Content-Type: text/html;charset=ISO-8859-1
Content-Language: en-GB
Content-Length: 182
Date: Sat, 04 Sep 2010 22:55:46 GMT
Redirect auf index:
GET /blog-war/ HTTP/1.1
Host: localhost:8181
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://localhost:8181/blog-war/ssl/login.xhtml
Cookie: JSESSIONID=eefdcda45337b9c897de2a0e95e3
Antwort:
HTTP/1.1 302 Moved Temporarily
X-Powered-By: Servlet/3.0
Server: GlassFish Server Open Source Edition 3.0.1
Pragma: No-cache
Cache-Control: no-cache
Expires: Thu, 01 Jan 1970 01:00:00 CET
Location: http://localhost:8080/blog-war/
Content-Type: text/html;charset=ISO-8859-1
Content-Language: en-GB
Content-Length: 181
Date: Sat, 04 Sep 2010 22:55:47 GMT
Wieder filter leitet auf http index.xhtml:
GET /blog-war/ HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Antwort:
HTTP/1.1 200 OK
X-Powered-By: Servlet/3.0, JSF/2.0
Server: GlassFish Server Open Source Edition 3.0.1
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: JSESSIONID=ef675cbb9747063c235fdb44137e; Path=/blog-war
Content-Type: text/html;charset=UTF-8
Content-Length: 3410
Date: Sat, 04 Sep 2010 22:55:48 GMT
Zu diesem Zeitpunkt Abmelden-link ist nicht gerendert, das bedeutet, dass wir nicht angemeldet sind? In der Antwort gibt es set-cookie so heißt es-server protokolliert me out? Nachdem man wieder auf die login-Seite beginnt es wieder von oben. Kann ich auch einfügen, server-logs, die unterscheidet sich ein wenig von normalen login und abnorme login-Szenario. Auch über den Ablauf in response, warum es ist Januar 1970? Ich bin echt verwirrt.
InformationsquelleAutor l245c4l | 2010-09-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da sollte man nicht in der Lage sein, um Zugriff eingeschänkter Seiten ohne eingeloggt zu sein, wenn mit container-managed security, ich vermute stark, dass die
isLoggedIn()
Methode falsch zurückgegebenfalse
die es Aussehen, dass Sie sind nicht angemeldet. Die Methode sollte mindestens so Aussehen:Update: richtig, wenn ein cookie erstellt, in HTTPS-Kontext (d.h. den
Secure
- flag), dann wird der cookie verloren, wenn Wechsel von HTTPS zu HTTP. Allerdings, wenn das cookie erstellt wurde, im HTTP-Kontext (d.h. hat keineSecure
- flag), dann wird das cookie verfügbar bleiben, sowohl HTTP-und HTTPS-Kontexten. Dies ist laut der RFC 2965 cookie-Spezifikation (überprüfen Sie die Beschreibung für dieSecure
flag).Abgesehen von der Verwendung
HttpServletRequest#logout()
andere Lösung wäre das cookie sofort während der Umleitung nach logout erstellen, anstatt es nur, wenn die login-Seite angefordert wurde, die über HTTPS. Sie können implizit ein neuer cookie erstellt, indem nur die Beantragung derHttpSession
Gut, obwohl ein bisschen zu kompliziert, Ihr
isLoggedIn()
sieht gut aus. Was servletcontainer verwenden Sie? Was passiert, wenn Sie F5 drücken nach dem login, die zeigt, dass man nicht angemeldet? Was bedeutet das request/response-Header sagen? Ich zumindest habe nicht gesehen, dieses problem vor und es ist schwer zu versuchen zu replizieren das gleiche problem, ohne weitere Details zu den Konfigurationen/Umgebung.F5 hat auch nicht geholfen. Ich bin mit glassfish v3. Es wirft einige Ausnahme: INFO: JACC-Policy-Provider: es konnte keine überprüfung der Berechtigung, Kontext(blog/blog-war_war)- Erlaubnis((javax.Sicherheit.jacc.WebUserDataPermission /ssl/login.xhtml-GET)) BESTE: JACC-Policy Anbieter: PolicyWrapper.getPermissions(d), Kontext (blog/blog-war_war) Berechtigungen: java.security.Permissions@1ef29515 (... Und ich denke, es ist weil ich angegeben habe, security-constraint SSL-Bereich in web.xml für /ssl/* (login-Seite ist unter /ssl/login.xhtml) und ich habe keine <auth-constraint - > aber ich habe es <user-data-constraint - > VERTRAULICH.
Kann ich einfügen, Protokolle, wenn Sie wollen. Und wie um zu überprüfen, werden diese Header? Nur drucken Sie es aus?
Sie können check-Header, mit FireBug oder Fiddler. Uhr für Unterschiede, wie die session-cookie-und Authentifizierungs-Header werden gesetzt/gesendet.
InformationsquelleAutor BalusC
Wenn Sie session.invalidate(), der richtige test für isLoggedIn() ist userPrincipal() != null && Sitzung.isRequestedSessionValid(). Sonst wird die Seite direkt nach dem Abmelden wird Ihnen zeigen, immer noch als eingeloggt.
Sollten Sie sich nicht umleiten auf die login-Seite selbst. CMA sollte das für Sie tun. Nur Umleitung zu einer Seite, die eine Anmeldung erfordert.
InformationsquelleAutor user207421