将 reCAPTCHA 与 Java/JSP 搭配使用

重要提示:reCAPTCHA API 1.0 版已不再受支持,请升级到 2.0 版。了解详情

reCAPTCHA Java 库提供了一种在基于 Java 的网站上添加人机识别系统的简单方法,可帮助您阻止机器人滥用该功能。该库封装了 reCAPTCHA API

如需将 reCAPTCHA 与 Java/JSP 搭配使用,您可以点击此处下载 reCAPTCHA Java 库(由 Soren 提供)并解压缩。通常,您只需要 jar 文件 (recaptcha4j-X.X.X.jar),您必须将该文件复制到您的 Java 应用可以加载该文件的位置。例如,如果您使用 Tomcat 运行 JSP,则可以将 jar 文件放在名为 WEB-INF/lib/ 的目录中。

快速入门

注册 API 密钥并下载 reCAPTCHA Java 库后,以下是在您的网站上安装 reCAPTCHA 的基本说明。

客户端(如何显示人机识别系统图片)

如果您想使用 Java 插件显示 reCAPTCHA widget,则需要导入相应的 reCAPTCHA 类。在 JSP 中,将以下代码行插入文件顶部附近,并将显示 reCAPTCHA widget 的表单元素插入该文件的顶部:

    <%@ page import="net.tanesha.recaptcha.ReCaptcha" %>
    <%@ page import="net.tanesha.recaptcha.ReCaptchaFactory" %>

然后,您需要创建一个 reCAPTCHA 实例:

    ReCaptcha c = ReCaptchaFactory.newReCaptcha("your_public_key", "your_private_key", false);

最后,可以通过以下函数调用获取用于显示 reCAPTCHA widget 的 HTML:

    c.createRecaptchaHtml(null, null)

因此,在 JSP 中,您的代码可能如下所示:

    <%@ page import="net.tanesha.recaptcha.ReCaptcha" %>
    <%@ page import="net.tanesha.recaptcha.ReCaptchaFactory" %>

    <html>
      <body>
        <form action="" method="post">
        <%
          ReCaptcha c = ReCaptchaFactory.newReCaptcha("your_public_key", "your_private_key", false);
          out.print(c.createRecaptchaHtml(null, null));
        %>
        <input type="submit" value="submit" />
        </form>
      </body>
    </html>

别忘了将 your_public_keyyour_private_key 替换为您的 API 密钥值。

服务器端(如何测试用户是否输入了正确答案)

在验证您的表单的应用中,您首先需要导入必要的 reCAPTCHA 类:

    import net.tanesha.recaptcha.ReCaptchaImpl;
    import net.tanesha.recaptcha.ReCaptchaResponse;

接下来,您需要插入用于验证用户输入的 reCAPTCHA 解决方案的代码。以下示例(在 JSP 中)展示了如何完成此操作:

    <%@ page import="net.tanesha.recaptcha.ReCaptchaImpl" %>
    <%@ page import="net.tanesha.recaptcha.ReCaptchaResponse" %>

    <html>
      <body>
      <%
        String remoteAddr = request.getRemoteAddr();
        ReCaptchaImpl reCaptcha = new ReCaptchaImpl();
        reCaptcha.setPrivateKey("your_private_key");
String challenge = request.getParameter("recaptcha_challenge_field"); String uresponse = request.getParameter("recaptcha_response_field"); ReCaptchaResponse reCaptchaResponse = reCaptcha.checkAnswer(remoteAddr, challenge, uresponse); if (reCaptchaResponse.isValid()) { out.print("Answer was entered correctly!"); } else { out.print("Answer is wrong"); } %> </body> </html>

在上面的代码中:

  • remoteAddr 是用户的 IP 地址(传递给 reCAPTCHA 服务器)
  • uresponse 包含用户对 reCAPTCHA 验证的回答。
  • 重要提示:DNS 缓存

    Java 有一个非常烦人的问题,可能会导致您的服务器与 reCAPTCHA 之间的连接每隔几个月就中断一次,发生这种情况时,reCAPTCHA 将停止在您的网站上运行。请参阅下文,了解如何解决此问题。

    默认情况下,Java 虚拟机 (JVM) 会永久缓存所有 DNS 查找,而不是使用每个主机的 DNS 记录中指定的存留时间 (TTL) 值。如果您不知道这一点,DNS 查找是发送到 DNS 服务器的请求,它会将可读的主机名转换为 IP 地址。例如,它会将 www.recaptcha.net 转换为 IP 地址 69.12.97.164。当然,这比这要复杂得多,如果您想了解详情,不妨从 wikipedia 的 DNS 条目着手。

    reCAPTCHA 服务器可能会更改 IP 地址,但频率较低。由于 Java 会永久缓存 DNS 查找,因此当 reCAPTCHA IP 地址发生更改时,这可能会导致服务器与 reCAPTCHA 之间的连接中断。如果发生这种情况,重启 JVM(例如重启 Tomcat)可以解决此问题,因为它会导致新的 DNS 查找。但是,由于 reCAPTCHA 服务器更改了 IP 地址,因此您可能不希望每几个月的网站发生故障时就重启 JVM。

    为了彻底解决此问题,您可以将 -Dsun.net.inetaddr.ttl=30 传递给您的应用服务器(这会告知 Java 仅将 DNS 缓存 30 秒)。在适用于 Windows 的 Tomcat 中,此操作可通过

    1. 停止 Tomcat
    2. 转到 tomcat\bin
    3. 运行 Tomcat5w.exe
    4. 转到“java”标签页
    5. 向 Java 选项部分添加了 Java 属性:-Dsun.net.inetaddr.ttl=30
    6. 退出
    7. 启动 Tomcat

    在适用于 Linux 或 MacOS X 的 Tomcat 中,您需要在命令行中运行以下命令(然后重启 Tomcat):

        export JAVA_OPTS="$JAVA_OPTS -Dsun.net.inetaddr.ttl=30"
    

    下列文章详细介绍了此问题。

    延伸阅读

  • 自定义外观和风格
  • 提示和指南
  • 问题排查