Session 使与CDI和x2B的会话无效;JSF不工作
我正在尝试在我的应用程序中实现注销,因此我做了以下操作:Session 使与CDI和x2B的会话无效;JSF不工作,session,jsf,cdi,invalidation,phaselistener,Session,Jsf,Cdi,Invalidation,Phaselistener,我正在尝试在我的应用程序中实现注销,因此我做了以下操作: public String logout(){ try{ FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext ex = facesContext .getExternalContext(); ex.invalidateSession(); return
public String logout(){
try{
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext ex = facesContext .getExternalContext();
ex.invalidateSession();
return "success";
}catch(Exception e){
return "error";
}
}
但当我检查用户是否已登录时,它会说是:
public class AuthenticateListener implements PhaseListener {
@Override
public void afterPhase(PhaseEvent event) {
AuthorizedUser authorized = (AuthorizedUser) Util.getHandler("authorized");
if (authorized.getUser() == null) {
System.out.println("Not Logged");
} else {
System.out.println("Logged");
}
}
@Override
public void beforePhase(PhaseEvent event) {
// TODO Auto-generated method stub
}
@Override
public PhaseId getPhaseId() {
return PhaseId.RESTORE_VIEW;
}
}
我错过什么了吗?在使会话无效后,我是否应该获得一个新的AuthorizedUser实例(sessionScoped)
编辑:如果有人需要,添加getHandler;)
在注销方法中使用以下代码:
HttpSession oldsession = (HttpSession) FacesContext
.getCurrentInstance().getExternalContext().getSession(false);
oldsession.invalidate();
这会奏效的。如果对您有帮助,请告诉我。该会话在当前请求-响应中仍然可用。在下一个请求中它不再可用。您需要在invalidate之后发送重定向,以便指示浏览器在给定URL上发送新请求
return "success?faces-redirect=true";
或者,如果您仍在使用老式的导航案例(返回值表明,使用文件名为“success”的视图很奇怪),则将
添加到导航案例中
如果这仍然不起作用,那么问题在于如何在会话中存储用户。例如,它实际上存储在应用程序范围中,当您将CDI与JSF混合使用时,或者当您将登录用户指定为静态变量而不是实例变量时,可能会发生这种情况
另见:
logout()
?这是像
或
这样的动作吗?如果在注销后,您从浏览器执行另一个请求,是否仍然看起来用户已登录?我怀疑它确实起作用了,但是你在错误的时间观察到了状态。还有,看,有问题了。在我的xhtml上调用了已注释的登录方法,但在访问页面后仍被调用。这样,用户总是登录到ex.invalidateSession()
的操作与您的尝试完全相同,不会导致潜在的NullPointerException
。
return "success?faces-redirect=true";