JSF 2重定向问题

Bhe*_*ung 3 redirect primefaces jsf-2

我在我的支持bean中有以下两种方法 -

public String validateUser() {
    FacesContext facesCtx = FacesContext.getCurrentInstance();

    if(userName.equals("user1") && password.equals("pass1")) {
        User user = new User();
        user.setUserName(userName);
        HttpSession session = (HttpSession) facesCtx.getExternalContext().getSession(false);
        session.setAttribute(User.SESSION_ATTRIBUTE, user);
        return "secured/home.jsf?faces-redirect=true";
    }

    if(!userName.equals(LoginBean.USERNAME)) {
        FacesMessage msgForUserName = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Username did not match.", null);
        facesCtx.addMessage("loginForm:userName", msgForUserName);
    }

    if(!password.equals(LoginBean.PASSWORD)) {
        FacesMessage msgForPassword = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Password did not match.", null);
        facesCtx.addMessage("loginForm:password", msgForPassword);
    }

    return null;
}

public String logout() {
    logger.info("Logging out .........................................");
    FacesContext facesCtx = FacesContext.getCurrentInstance();
    HttpSession session = (HttpSession) facesCtx.getExternalContext().getSession(false);
    session.invalidate();
    return "login.jsf?faces-redirect=true";
}
Run Code Online (Sandbox Code Playgroud)

我不知道为什么重定向在第一种方法(即validateUser())中工作,但它不在第二种方法(即logout())中工作.注销方法中的代码实际上已执行,会话也会失效,但浏览器会以某种方式停留在同一页面上.而且,我正在使用PrimeFaces p:commandButton并且两者都启用了ajax.任何一个,任何想法?谢谢.

Bal*_*usC 5

但不知何故,浏览器停留在同一页面上.而且,我正在使用PrimeFaces p:commandButton并且两者都启用了ajax

我不指望它会失败.我怀疑这与失效的会话有关.与试用ajax="false"<p:commandButton>.


此问题无关,您应该尝试最小化javax.servletJSF托管bean中的导入.他们经常表明你在错误的地方或笨拙的方式做事.在纯JSF2中,您可以按如下方式使会话无效:

FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
Run Code Online (Sandbox Code Playgroud)

您可以通过会话Map在会话中获取/设置对象.

Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
// ...
Run Code Online (Sandbox Code Playgroud)

或者只是使它成为托管bean(属性).

也可以看看: