在p:commandButton操作中丢失了javax.faces.ViewState

时间:2013-02-01 18:46:28

标签: java jsf-2 primefaces java-ee-6

我有一个简单的登录表单,可以调用一个操作,如果登录成功则返回安全区域的视图ID。我想使用ajax进行操作,但是当页面被重定向时,表单中不存在javax.faces.ViewState,因此用户必须单击两次才能恢复它。如果我设置ajax =“false”,一切正常,除非我放松了用p:ajaxSatatus实现的酷转换。

在使用BlausC http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html#AjaxRenderingOfContentWhichContainsAnotherForm的博客文章之前,我已经处理过这类问题 我也见过commandButton/commandLink/ajax action/listener method not invoked or input value not updated

我过去使用richfaces成功解决了这个问题,但现在我被卡住了。

我的环境是: Mojarra 2.1.6 PrimeFaces 3.4.2 GlassFish Server开源版3.1.2.2

代码:

<h:form id="loginForm">
    <div style="margin: 0px auto; width: 300px;">
        <p:messages />
        <p:panelGrid columns="2" styleClass="panelGridNoBorder">
            <h:outputLabel value="Name: " for="txtPrincipal"/>
            <p:inputText id="txtPrincipal" value="#{userBean.principal}"/>
            <h:outputLabel value="Email:" for="txtPassword"/>
            <p:password id="txtPassword" value="#{userBean.password}" />
        </p:panelGrid>
        <p:commandButton id="loginButon" action="#{userBean.login}" value="Login"/>
    </div>
</h:form>

UserBean.java @SessionScoped

public String login() {
    try {
        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        loginedUser = autenticator.authenticate(principal, passHash, request.getRemoteAddr());
        request.login(principal, passHash);
        if (loginedUser != null) {
            return "/admin/index.xhtml";
        } else {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Usuario o contraseña incorrecto", "Usuario o contraseña incorrecto");
            FacesContext.getCurrentInstance().addMessage(null, message);
            return null;
        }
    } catch (ServletException ex) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Usuario o contraseña incorrecto", "Usuario o contraseña incorrecto");
        FacesContext.getCurrentInstance().addMessage(null, message);
        return null;
    }
}

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

如果您正在使用MSIE浏览器,则可以识别您的具体问题。您基本上需要覆盖PrimeFaces ajax响应处理程序。另请参阅this answer以获取具体的代码示例。

但是,更好的是在登录后发送重定向。这也是规范方法符合Post-Redirect-Get模式。

return "/admin/index.xhtml?faces-redirect=true";