我正在使用PF3.5 + JSF2.1.22,在我的Web应用程序中,我正在使用Primefaces Captcha组件。我在capcha组件中遇到了一些奇怪的问题,我在应用程序中使用了像这样的验证码组件
<p:captcha id="captcha" label="Captcha" theme="white" />
我有一个PF命令页面将值提交给bean
<p:commandButton id="clear" value="Clear" update="captcha" styleClass="kuberbutton" />
当我在表单提交后使用上面的按钮时,如果有任何验证问题和其他问题再次加载,那么Captcha在页面中不再可见,但当我在PF按钮中使用ajax="false"
时它会工作正常,这是我必须做ajax="false"
这个组件的行为吗?我查看了PF网站,他们也做了同样的事情Primefaces Captcha
答案 0 :(得分:8)
Captcha 组件目前不支持ajax行为,这就是为什么必须在ajax="false"
中使用<p:commandButton
,必须完全重新加载您的页面才能使验证码工作正确...
如果您必须具有ajax行为,则可以使用其他第三方解决方案......
没有尝试过以下内容,但它可能有助于解决ajax问题:
Displaying reCAPTCHA Without Plugins
How can I load a reCaptcha form using jQuery/AJAX while leaving the reCaptcha scripts in place?
答案 1 :(得分:0)
如前所述,Primefaces Captcha组件无法通过ajax请求进行更新。但是有一个简单的解决方案 - 更新所有内容,但不更新Captcha组件本身。
您的XHTML:
<h:form id="myForm">
<h:panelGroup id="updateFormAllValuesButNotCaptcha">
Name: <p:inputText id="name" value="#{captchaBean.name}" required="true"/>
<br/>
Comment: <p:inputTextarea id="comment" value="#{captchaBean.comment}" required="true"/>
<br/>
</h:panelGroup>
<p:captcha/>
<p:commandButton value="click me" update="updateFormAllValuesButNotCaptcha"
actionListener="#{captchaBean.someAction}" oncomplete="Recaptcha.reload()"
onerror="Recaptcha.reload()"/>
</h:form>
<p:messages globalOnly="false" autoUpdate="true"/>
你的支持bean:
@ManagedBean
@ViewScoped
public class CaptchaBean implements Serializable {
private String name;
private String comment;
public String getComment() { return comment; }
public void setComment(String comment) { this.comment = comment; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public void someAction() {
FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Done", "");
FacesContext.getCurrentInstance().addMessage(null, msg);
}
}
请注意,我正在更新updateFormAllValuesButNotCaptcha
面板,其中包含所有表单输入字段,但不包含Captcha本身。同样重要的是要注意Captcha不能被重用,因此当ajax请求完成或以错误结束时,你必须重新加载它。
commandButton的操作成功后更新的内容取决于您。您可以隐藏表单(不要呈现它)并仅显示确认消息,以确保用户不会再尝试发送评论。