【问题标题】:Primefaces Captcha Component not workingPrimefaces验证码组件不工作
【发布时间】:2013-05-30 12:45:13
【问题描述】:

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

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

【问题讨论】:

  • here中有一个关于这个问题的仓库

标签: jsf-2 primefaces


【解决方案1】:
Primefaces 中的

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


如果您必须具有 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?

【讨论】:

  • 您为 ajax 行为提出了哪些第三方解决方案?我想在一个基于 ajax 请求的向导对话框中显示 recaptcha,而 primefaces 绝对不是这个问题的有效解决方案。
【解决方案2】:

如前所述,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 不能重复使用,因此您必须始终在 ajax 请求完成或以错误结束时重新加载它。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-28
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    相关资源
    最近更新 更多