0

我有一个简单的登录表单,它调用一个动作,如果登录成功,则返回安全区域的视图 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 操作/listener 方法未调用或输入值未更新

我过去成功地解决了这个问题,但现在我被困住了。

我的环境是:Mojarra 2.1.6 PrimeFaces 3.4.2 GlassFish Server Open Source Edition 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;
    }
}

谢谢您的帮助

4

1 回答 1

0

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

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

return "/admin/index.xhtml?faces-redirect=true";
于 2013-02-01T20:02:08.480 回答