针对java验证码库的建议

ska*_*man 61 java captcha recaptcha java-ee simplecaptcha

我正在寻找JCaptcha的替代品,它似乎不再维护,并且开始时并不是很好.替换必须与JavaEE webapps很好地集成.

我可以看到,有三种选择:

  • JCaptcha - 不再维护原油API
  • SimpleCaptcha - 更好的API,更好的验证码,但似乎只是Java6
  • ReCaptcha - 易于使用,使用远程Web服务生成验证码,但无法控制外观

有没有人使用过他们推荐的其他人?

小智 71

我是SimpleCaptcha的作者.虽然我建议 - 为了人类的缘故 - 尽可能使用ReCaptcha,我提供了SimpleCaptcha,因为有些组织有禁止像ReCaptcha这样的库的政策.SimpleCaptcha意味着完全独立,没有外部依赖:只要你在J2EE容器中,你应该是好的.

此外,SimpleCaptcha现在可用于Java 1.5或Java 6.

  • 你的解决方案效果很好,但我从(http://repo.enonic.com/maven)获得它的最后一个maven repo是关闭的,没有其他位置...我会把一个罐子放进我的git,但它仍然是如果在maven中git它会很棒. (2认同)

Fra*_*cis 26

ReCaptcha是你应该使用的唯一验证码,因为它是唯一能够让世界变得更好的验证码(将OCR结果改进为旧文本),几乎无限的数据库.

所有其他验证码通常受其数据库的限制,或者对这个世界没有任何好处.

编辑::我找到了如何使用recaptcha实现验证码的步骤.

您可以在此处使用java检查在线和离线验证码

  • 好的,但是对人类的好处并不是我的优先级列表:)而且,JCaptcha和SimpleCaptcha生成随机验证码,因此数据库大小不是问题. (18认同)
  • 我质疑随机化的capthas比数据库支持的验证码更容易受到攻击的说法.关于ReCaptcha的主题,一个好处是它放在人类面前的是一个高质量的OCR实现已经失败的词. (6认同)
  • recaptcha对于​​很多人来说太难了,它常常难以理解 (6认同)
  • 我想知道reCaptcha的人性化益处是否能够覆盖中国大陆的防火墙后面的人们.:) http://stackoverflow.com/questions/23780387/recaptcha-availability-in-china (3认同)
  • 还有一件事 - 许多带有彩色/旋转背景/线条/图像的验证码对于大多数用户而言过于复杂(例如,着名的Cat编号使用的Cat编号).相反,recaptcha是基于真实的英语单词,因此对大多数人来说都是eaiser.您不会想要应用验证码,90%的人会向您发送邮件说"我无法通过cpatcha"... (2认同)
  • reCaptcha是第三方流程,可能需要它的组织关闭或不允许. (2认同)

Mik*_*ike 19

当ReCaptcha关闭/不可用时会发生什么?您的服务是否会停止?当你失败的时候,你只是停止签名吗?即使ReCaptcha没有运行,您是否允许用户注册?如果是这样,这有什么安全隐患?特别是如果您使用CAPTCHA而不仅仅是注册,例如重置密码表单,登录表单,......如果没有CAPTCHA组件,则无法接受.

CAPTCHA的Java世界处于悲伤状态,SimpleCaptcha似乎是那些无法接受托管服务的人的最佳解决方案.

  • 谷歌之前曾多次失败(不只是Gmail,还有搜索).如果您有自己的服务,只有您自己使用,那么您可以轻松地说,当您的验证码关闭时,整个系统都会关闭.我确实想知道Facebook在发生中断时会做什么 - 他们是否必须在修复之前将其暴露?他们有备份计划吗?停电甚至对他们来说很重要吗?如果您提供的服务比查看是谁更重要,或者您有SLA要求,那么解决方案就不像"等待它"那么简单. (5认同)
  • 来吧,你真的认为你的服务比ReCaptcha更稳定,特别是当谷歌准备好了吗?即使Facebook正在使用ReCaptcha,所以不要担心,除非你运行比Facebook更大的服务......我仍然没有想到任何验证码系统比ReCaptcha更好. (3认同)
  • @Stephen - 当首席执行官敲门时询问为什么他们在第N次忘记密码后无法重置密码,或者无法将最新的大奶酪客户添加到系统中,"通常不关键"不会不会削减它.它归结为您的服务提供的内容,以及SLA对它的要求."通常不重要"是SLA的问题,不应该被彻底驳回. (3认同)
  • @Makky - 自从我发表这篇文章以来,我们已经有2次重新收回失败.一个当URL改变(https://groups.google.com/forum/?fromgroups#!topic/recaptcha/V7qswqBnA1o),和一个当IP地址改变(https://groups.google.com/forum/? fromgroups#!话题/验证码/ _Lg_MHsGKLw).是的,两次大佬都在敲我们的门,想知道为什么他们无法登录.如果我们有一个自托管解决方案,验证码失败的唯一时间是目标系统也关闭. (3认同)

Jon*_*ens 10

我之前创建了http://kaptcha.googlecode.com,之后recaptcha变得像今天一样受欢迎.它还为您提供了自己托管的能力,这在某些情况下可能是必要的.

Kaptcha是SimpleCaptcha的一个经过大量修改和更新的版本,支持JDK5/6.


Til*_*err 5

SimpleCaptcha非常好用且易于使用.

以下是如何将SimpleCaptcha与JSF 2.0一起使用的示例(主页有JSP示例)

请注意,我甚至不打算将验证码值存储在bean中,我只是在验证它.

豆子:

// imports missing here

@ManagedBean
@SessionScoped
public class LoginBean implements Serializable
{
    public void validateCaptcha(FacesContext context,
            UIComponent componentToValidate,
            Object value)
            throws ValidatorException
    {
        HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
        Captcha secretcaptcha = (Captcha) session.getAttribute(Captcha.NAME);
        if (secretcaptcha.isCorrect(value.toString()))
            return;

        // optional: clear field
        ((HtmlInputText) componentToValidate).setSubmittedValue("");

        throw new ValidatorException(new FacesMessage("Captcha does not match"));
    }
}
Run Code Online (Sandbox Code Playgroud)

facelet的相关部分:

        <h:form id="CaptchaForm">
            Type this: <br/>
            <h:graphicImage id="CaptchaImgID" value="/simpleCaptcha.png"/> <br/>
            <h:inputText id="CaptchaID"
                         required="true"
                         requiredMessage="Captcha missing"
                         validator="#{loginBean.validateCaptcha}"
                         validatorMessage="Captcha does not match"
                         immediate="true">
            </h:inputText>
            <br/>
            <h:commandButton value="Check"/>

            <p/>
            <!-- message for the input field -->
            <h:message id="CaptchaMsgID" for="CaptchaID" style="color:red" />
        </h:form>
Run Code Online (Sandbox Code Playgroud)

web.xml的相关部分:

<servlet>
    <servlet-name>SimpleCaptcha</servlet-name>
    <servlet-class>nl.captcha.servlet.SimpleCaptchaServlet</servlet-class>
<init-param>
    <param-name>captcha-width</param-name>
    <param-value>250</param-value>
</init-param>
<init-param>
    <param-name>captcha-height</param-name>
    <param-value>75</param-value>
</init-param>
</servlet>
<servlet-mapping>
    <servlet-name>SimpleCaptcha</servlet-name>
    <url-pattern>/simpleCaptcha.png</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

请享用 :-)