Jsf 2 Primefaces验证码组件不工作

Jsf 2 Primefaces验证码组件不工作,jsf-2,primefaces,Jsf 2,Primefaces,我使用的是PF3.5+JSF2.1.22,在我的web应用程序中,我使用的是Primefaces验证码组件。我在capcha组件中遇到了一些奇怪的问题,我在应用程序中使用了像这样的captcha组件 <p:captcha id="captcha" label="Captcha" theme="white" /> 我有一个PF命令页面将值提交给bean <p:commandButton id="clear" value="Clear" update="captcha" st

我使用的是PF3.5+JSF2.1.22,在我的web应用程序中,我使用的是Primefaces验证码组件。我在capcha组件中遇到了一些奇怪的问题,我在应用程序中使用了像这样的captcha组件

<p:captcha id="captcha" label="Captcha" theme="white" />

我有一个PF命令页面将值提交给bean

<p:commandButton id="clear" value="Clear" update="captcha" styleClass="kuberbutton" />


当我在表单提交后使用上述按钮时,如果再次加载任何验证问题和其他即将出现的问题,则验证码在页面中不再可见,但当我在PF按钮中使用
ajax=“false”
时,它正在工作,这是该组件工作的行为吗?我必须执行
ajax=“false”
?我查看了PF网站,他们也做了同样的事情,Primefaces中的验证码组件目前不支持ajax行为,这就是为什么您必须在
中使用
ajax=“false”
,正如前面所说的,Primefaces验证码组件不能通过ajax请求更新。但有一个简单的解决方案-更新所有内容,但不更新验证码组件本身

您的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"/>
请注意,我正在更新
updateFormAllValuesButNotCaptcha
面板,该面板包含所有表单输入字段,但不包含Captcha本身。同样重要的是要注意Captcha不能被重用,所以当ajax请求完成或以错误结束时,您必须始终重新加载它


commandButton操作成功后更新的内容由您决定。您可以隐藏表单(不呈现表单)并仅显示确认消息,以确保用户不会再次尝试发送评论。

对于ajax行为,您建议使用哪些第三方解决方案?我想在基于ajax请求和primefaces的向导对话框中显示recaptcha,它肯定不是解决此问题的有效解决方案
@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);
    }
}