【问题标题】:Primefaces Captcha disappears or doesn't update/refresh on invalid input?Primefaces Captcha 消失或不更新/刷新无效输入?
【发布时间】:2012-02-17 05:49:22
【问题描述】:

我在h:form 中有以下代码

<h:panelGrid id="captchaGrid">
    <p:captcha id="captcha" label="Captcha" required="true"
        requiredMessage="required"
        validatorMessage="...">
    </p:captcha>
    <p:message id="captchaMessage" for="captcha" />
</h:panelGrid>

<p:commandButton id="submitButton" value="save"
    actionListener="#{userBean.save}" update="captchaGrid"
    onstart="doSomething()"
    oncomplete="doSomethingElse(xhr, status, args)" icon="ui-icon-check">
</p:commandButton>

如果我正确输入验证码,这将正常工作。但是,如果我输入一个无效值,验证码组件就会消失。

我尝试删除 update="captchaGrid" 属性。这一次,验证码没有消失。相反,它并没有在视觉上刷新,而是(我猜)在内部刷新。因为正确输入这两个词仍然会产生验证错误。

此外;我不想使用ajax="false"

更新:我也试过oncomplete="Recaptcha.reload()"。没用。有一个错误。但我不知道是我的代码还是 Primefaces 3.0 :)

更新 2: 正如 maple_shaft 所指出的,事实证明这是 Primefaces/Recaptcha 的问题。所以我正在寻找你可能建议的任何肮脏的黑客攻击。

任何帮助表示赞赏。

【问题讨论】:

    标签: java jsf jakarta-ee primefaces captcha


    【解决方案1】:

    你不会喜欢我的回答,但这不是错误。

    Primefaces Issue 1642 被标记为不会修复。

    Primefaces Captcha 使用 Recaptcha,它不支持也不支持 Ajax 刷新。您必须执行整页回发才能使该组件正常工作。请记住,这也会影响在需要 Ajax 刷新面板的组件(例如选项卡视图或向导组件)中使用验证码的能力。

    编辑:另一方面,可以在&lt;iframe&gt; 中使用验证码组件来实现类似的效果,但这似乎是一种肮脏的黑客行为。抱歉,我不能提供更多帮助。

    【讨论】:

    • 我真的不喜欢你的回答 maple_shaft,但谢谢 :) 有没有办法可以提交包含 iframeh:form?当然,我也想提交iframe的内容。
    • @Murat 我不相信 iframe 是这样工作的。 iframe 的内容是一个完全不同的页面,因此可能需要一些聪明的 Javascript。我已经 8 年多没有使用 iframe 了,所以我记不太清了。您应该在另一个问题中询问有关从母版页提交 iframe 中的表单的问题,以获得更好的答案。
    【解决方案2】:

    它很脏,但请尝试在对话框中使用验证码。它对我有用....

      <p:dialog widgetVar="captchaDlgWar" modal="true" closable="false" resizable="false"
                  header="Prove you are human..." width="350" height="200">
    
            <h:form>
                <h:panelGrid columns="1">
    
                    <p:captcha label="Captcha"
                               id="captchaId"
                               language="tr"
                               theme="white"
                               required="true"
                               requiredMessage="Please Enter Capcha Text"
                               validatorMessage="Captcha text does not match."/>
                    <p:commandButton id="btnContinue"
                                     ajax="false"
                                     value="Continue"
                                     actionListener="#{MyBean.onButtonAction}"/>
    
                </h:panelGrid>
            </h:form>
        </p:dialog>
    

    我的豆-------->

    public void onButtonAction(ActionEvent e) {
       RequestContext.getCurrentInstance().execute("captchaDlgWar.hide()");
       //Do your stuff
    }
    

    【讨论】:

      【解决方案3】:

      @user2393398 提示的派生。

      不要更新p:captcha,使用p:ajaxStatus重新加载。

      <h:form style="width: 400px;" >
          <h:outputText value="Informe seu CPF/CNPJ ou E-mail abaixo, e um e-mail de recuperação será enviado para seu endereço." />
          <br /><br />
          <p:messages id="messageGlobal" globalOnly="true" />
          <h:panelGrid columns="3" cellspacing="5" >
              <h:outputLabel for="inputUsuarioRecuperacao" value="CPF/CNPJ ou E-mail: " style="float: right;"/>    
              <p:inputText id="inputUsuarioRecuperacao" value="#{loginController.usuario}" required="true" size="30" />
              <p:message id="messageUsuarioRecuperacao" for="inputUsuarioRecuperacao" display="icon" />
              <p:spacer />
              <p:captcha id="inputCaptcha" theme="white" secure="true" validatorMessage="Os caracteres inseridos não correspondem à verificação de palavras. Tente novamente." />
              <p:message id="messageCaptcha" for="inputCaptcha" display="icon" />
              <p:spacer />
              <p:commandButton value="Enviar" actionListener="#{loginController.enviarEmailRecuperarSenha()}" update="messageGlobal messageCaptcha messageUsuarioRecuperacao" />
          </h:panelGrid>
          <p:ajaxStatus onsuccess="Recaptcha.reload();" />
      </h:form> 
      

      【讨论】:

      • 是的,只是添加 &lt;p:ajaxStatus oncomplete="Recaptcha.reload();" /&gt; 似乎对我有用。
      【解决方案4】:

      我还没有找到任何重新加载验证码的方法,所以我要做的是使用 JavaScript 在 oncomplete 或 onerror 事件中重新加载它。

      Recaptcha.reload();
      

      也许它对你有用。

      【讨论】:

        猜你喜欢
        • 2015-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-06
        • 2011-11-07
        • 2013-09-22
        • 2012-01-25
        相关资源
        最近更新 更多