Primefaces Captcha组件无法正常工作

时间:2013-06-04 07:49:12

标签: jsf-2 primefaces

我正在使用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

2 个答案:

答案 0 :(得分:8)

Primefaces中的

Captcha 组件目前不支持ajax行为,这就是为什么必须在ajax="false"中使用<p:commandButton,必须完全重新加载您的页面才能使验证码工作正确...


如果您必须具有ajax行为,则可以使用其他第三方解决方案......


没有尝试过以下内容,但它可能有助于解决ajax问题:

recaptcha - AJAX AP

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的操作成功后更新的内容取决于您。您可以隐藏表单(不要呈现它)并仅显示确认消息,以确保用户不会再尝试发送评论。