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>