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";