5

我正在使用 PF3.5+JSF2.1.22 并且在我的 Web 应用程序中我正在使用 Primefaces Captcha 组件。我在验证码组件中遇到了一些奇怪的问题,我在应用程序中使用了这样的验证码组件

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

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

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

当我在表单提交后使用上面的按钮时,如果有任何验证问题和其他问题出现并且年龄再次加载,那么验证码在页面中不再可见但是当我ajax="false"在 PF 按钮中使用时它正在工作,这是行为吗我必须做的组件会起作用ajax="false"吗?我检查了 PF 网站,他们也做了同样的事情Primefaces Captcha

4

2 回答 2

8

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


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


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

回顾 - AJAX AP

显示没有插件的 reCAPTCHA

如何在保留 reCaptcha 脚本的同时使用 jQuery/AJAX 加载 reCaptcha 表单?

于 2013-06-04T08:11:44.087 回答
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包含所有表单输入字段但不包含验证码本身的面板。同样重要的是要注意验证码不能重复使用,因此您必须始终在 ajax 请求完成或以错误结束时重新加载它。

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

于 2013-08-07T15:30:42.323 回答