当前位置: 首页 > 知识库问答 >
问题:

p:commandButton操作时javax.faces.ViewState丢失

景昊焜
2023-03-14

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

在过去,我成功地与富家子弟一起解决了这个问题,但现在我陷入了困境。

我的环境是: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个答案

柳涵映
2023-03-14

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

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

return "/admin/index.xhtml?faces-redirect=true";
 类似资料:
  • 这可不是一个简单的话题。其中涉及了应用程序中的诸多领域,你可能想要同步 API 的响应,或者你想要处理其它类型的流,比如 UI 中的点击事件或键盘事件。 有大量的操作符以它们各自的方式来处理时间,比如 delay、 debounce、 throttle、 interval, 等等。 interval 这个操作符用来创建一个 Observable,基本上它所做的就是按固定的时间间隔提供值,函数签名如

  • 问题内容: 是否有API可以按时(小时,分钟)快速进行操作(例如加,减)。 伪代码在下面列出 问题答案: http://joda-time.sourceforge.net/

  • 问题内容: 在JSF中减小viewstate隐藏字段大小的最佳方法是什么?我已经注意到,我的视图状态大约为40k,这会下降到客户端,并在每次请求和响应(尤其是到达服务器)时都返回到服务器,这对于用户来说是一个严重的问题。 我的环境JSF 1.2,MyFaces,Tomcat,战斧,RichFaces 问题答案: 您是否尝试过将状态保存设置为服务器?这应该仅将ID发送给客户端,并在服务器上保持完整状

  • 使用Juno和Eclipse PDE。尝试创建一个简单的插件(使用模板Hello,World Command)。运行时,日志中会显示以下消息: !消息找不到操作集: 你好世界.action集 正如在Q: Eclipse Missing Action Set中建议的那样,我创建了一个新的工作区,重新创建了项目并重新安装了PDE。这些都没有任何效果。 我该如何解决这个问题?

  • 问题内容: 我几乎与Nathon Taylor在ASP.NET MVC- 控制器之间的共享会话状态中描述的场景完全相同。问题是,如果我将路径保存到Session变量中的图像,则不会在ItemController中定义它,因此所有路径都将丢失…这是我的设置: 在ImageController内部,我具有Upload()操作方法: 然后在我的ItemController中,我有New()操作方法,该方

  • 当将许多Excel文件与aspose组合在一起时,我得到的是单个工作簿(包含许多工作表的Excel文件)。但问题是我没有得到HTML样式(颜色,字体,大小背景颜色...)合并前的每个工作表中都有。 下面是我的java代码: 我不知道是否有一个选项使aspose在组合工作簿时考虑到样式?