我有一个简单的登录表单,可以调用一个操作,如果登录成功则返回安全区域的视图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;
}
}
感谢您的帮助
答案 0 :(得分:0)
如果您正在使用MSIE浏览器,则可以识别您的具体问题。您基本上需要覆盖PrimeFaces ajax响应处理程序。另请参阅this answer以获取具体的代码示例。
但是,更好的是在登录后发送重定向。这也是规范方法符合Post-Redirect-Get模式。
return "/admin/index.xhtml?faces-redirect=true";