Java Primefaces验证码消失或不存在';是否对无效输入进行更新/刷新?

Java Primefaces验证码消失或不存在';是否对无效输入进行更新/刷新?,java,jsf,jakarta-ee,primefaces,captcha,Java,Jsf,Jakarta Ee,Primefaces,Captcha,我在h:form <h:panelGrid id="captchaGrid"> <p:captcha id="captcha" label="Captcha" required="true" requiredMessage="required" validatorMessage="..."> </p:captcha> <p:message id="captchaMessage" for="captc

我在
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的一个问题。所以我在寻找你可能建议的任何肮脏的黑客


感谢您的帮助。

您不会喜欢我的答案,但这不是一个bug

标记为无法修复

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


编辑:另一方面,在
中使用captcha组件可能会达到类似的效果,但这似乎是一个肮脏的攻击。很抱歉,我帮不上什么忙。

它很脏,但请尝试在对话框上使用验证码。它在为我工作

  <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>

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

Recaptcha.reload();

也许它对你有用。

是@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> 




我真的不喜欢你的答案maple_shaft,但谢谢:)有没有办法提交一份包含
iframe
h:form
?当然,我也想提交
iframe
的内容。@Murat我不相信iframe是这样工作的。iframe的内容是一个完全不同的页面,因此可能需要一些聪明的Javascript。我已经8年多没用过iFrame了,所以我记不太清楚了。你应该在另一个问题中询问在母版页的iframe中提交表单的问题,以获得更好的答案。是的,添加
似乎对我很有帮助。
<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>