4

我正在尝试在我的应用程序中实现注销,所以我做了这个:

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,如果有人需要它;)

public static Object getHandler(String handlerName) {

    FacesContext facesContext = FacesContext.getCurrentInstance();
    ELContext elContext = facesContext.getELContext();
    ELResolver resolver = facesContext.getApplication().getELResolver();

    Object uh = resolver.getValue(elContext, null, handlerName);
    return uh;
}
4

2 回答 2

1

该会话在当前请求-响应中仍然可用。在下一个请求中不再可用。您需要在失效后发送重定向,以便指示浏览器在给定 URL 上发送新请求。

return "success?faces-redirect=true"; 

或者,如果您仍在使用老式的导航案例(返回值即表明这一点;拥有文件名“成功”的视图很奇怪),然后添加<redirect/>到导航案例中。

如果这仍然不起作用,那么错误在于您如何将用户存储在会话中。例如,它实际上存储在应用程序范围中,当您将 CDI@Named与 JSF混合@SessionScoped时,或者当您将登录用户分配为静态变量而不是实例变量时,可能会发生这种情况。

也可以看看:

于 2012-12-20T13:57:20.737 回答
-2

在注销方法中使用这段代码:

HttpSession oldsession = (HttpSession) FacesContext
                .getCurrentInstance().getExternalContext().getSession(false);
oldsession.invalidate();

这将起作用。如果对您有帮助,请告诉我。

于 2012-12-20T12:29:46.607 回答