针对java验证码库的建议

时间:2009-05-01 07:20:10

标签: java java-ee captcha recaptcha simplecaptcha

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

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

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

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

7 个答案:

答案 0 :(得分:71)

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

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

答案 1 :(得分:25)

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

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

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

您可以使用java here

检查在线和离线验证码

答案 2 :(得分:19)

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

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

答案 3 :(得分:10)

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

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

答案 4 :(得分: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"));
    }
}

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>

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>

享受: - )

答案 5 :(得分:3)

如果您希望托管自己的验证码服务而不是依赖第三方验证码服务(如recaptcha),Kaptcha是Recaptcha的一个不错的选择。

答案 6 :(得分:-2)

我能够获得源代码(从浏览器逐个获取,而不是GIT :-()并使用1.5进行构建。我遇到了JDK 1.5版本的问题,导致了错误的类版本错误(当出现错误时出现的错误)用旧的java版本编译搞砸了)当我复制我自己构建的jar并且它就像魅力一样解决了。我强烈建议任何人使用它。我试过jcaptcha而且我必须说它糟透了...访问者网络不应该努力验证图像中的代码,这会破坏目的....