Sitzung.invalidate() nicht wirklich löscht JSF session-scoped Werte
Sehe ich ein ähnliches Problem wie bereits in diesem Frage - https://stackoverflow.com/questions/1495390/how-do-i-invalidate-a-session-in-jsf.
Habe ich eine session-scoped LoginBean, die haben eine Aktion logout als #
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
HttpSession session = (HttpSession) ec.getSession(false);
HttpServletResponse response = (HttpServletResponse) ec.getResponse();
//remove cookies
response.addCookie(facade.removeCookie(((HttpServletRequest)ec.getRequest()).getCookies()));
//check what we have in sessionMap
System.out.println(ec.getSessionMap());
//remove attribute
session.removeAttribute("XYZ");
//invalidate session
if (session != null) {
System.out.println("invalidating session");
session.invalidate();
}
//see what is there in session map
System.out.println(ec.getSessionMap());
Es fast funktionieren.
Ausgabe #
{xyzBean=com.xyz.bean.XYZBean@46f046f0,... }
invalidating session
{}
Der sessionMap leer, d.h. es sind keine session-scope Bohnen. Aber nach logout action es leitet zu einer anderen Seite. Anmeldung eine Ebene auf der gleichen Seite. Ich sehe, dass fragment jsps noch zeigt die alten Daten.
Bin ich nicht entfernen JSESSIONID in der Fassade.removeCookie. Es entfernt einige andere cookies im Zusammenhang mit Benutzer.
Jede Hilfe würde geschätzt werden.
Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie wahrscheinlich betrachten eine Seite, die wurde serviert vom browser-cache. Müssen Sie die HTTP-response-Header, die weist den webbrowser an, die nicht im cache, dynamische Seiten. Sie können dies tun, mit einem
javax.servlet.Filter
was ist abgebildet auf einem<url-pattern>
von Interesse, z.B.*.jsf
oder so und hat die folgenden job indoFilter()
Methode:Vergessen Sie nicht, löschen Sie den browser-cache vor dem testen 😉
In keinem Zusammenhang zu dem problem, das
if (session != null)
nullcheck in deinem code ist überflüssig, da-Sitzung kann nie null sein, wenn es erreicht, dass nullcheck. Wenn es null war, es würde haben geworfenNullPointerException
amremoveAttribute()
Anruf und somit nie erreichen nullcheck.