重要提示:1.0 版 reCAPTCHA API 不再受支持,请升级到 2.0 版。了解详情
reCAPTCHA 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 微件,则需要将 相应的 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_key
和 your_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 查找,而不是使用 存留时间 (TTL) 值,该值在每个主机的 DNS 记录中指定的。对于 DNS 查找是发送给 DNS 服务器的请求, IP 地址读取主机名。例如,它会将 www.recaptcha.net 转换为 IP 地址 69.12.97.164。当然,这比这要复杂得多 有关详情,请参阅维基百科的介绍 不妨从 DNS 着手。
reCAPTCHA 服务器可能会更改 IP 地址,但频率并不高。因为 Java 会缓存 DNS 永久查找,这可能会导致您的服务器和 reCAPTCHA 之间的连接断开 当 reCAPTCHA IP 地址发生更改时触发。如果发生这种情况,请重启您的 JVM(例如,通过 Tomcat)可以解决此问题,因为它会导致执行新的 DNS 查找。不过,您可能无需 您需要每隔几个月就在网站发生故障时重启一次 JVM,因为 reCAPTCHA 服务器更改了 IP 地址。
要永久解决此问题,您可以将 -Dsun.net.inetaddr.ttl=30 传递给 app-server(这指示 Java 仅将 DNS 缓存 30 秒)。在适用于 Windows 的 Tomcat 中 由
- 停止 Tomcat
- 转到 Tomcat\bin
- 运行 Tomcat5w.exe
- 转到“java”标签页
- 将 Java 属性添加到了 java options 部分:-Dsun.net.inetaddr.ttl=30
- 退出
- 启动 Tomcat
在适用于 Linux 或 MacOS X 的 Tomcat 中,您需要在命令行中运行以下命令 (然后重启 Tomcat):
export JAVA_OPTS="$JAVA_OPTS -Dsun.net.inetaddr.ttl=30"
点击此处查看相关文章 对此问题的进一步说明