使CDI + JSF无效的会话失效

时间:2012-04-27 12:32:01

标签: session jsf cdi invalidation phaselistener

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

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

2 个答案:

答案 0 :(得分:1)

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

return "success?faces-redirect=true"; 

或者,如果您仍在使用旧式导航案例(返回值表示;具有文件名“成功”的视图很奇怪),请将<redirect/>添加到导航案例中。

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

另见:

答案 1 :(得分:-1)

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

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

这会奏效。如果它对你有帮助,请告诉我。