將 reCAPTCHA 與 Java/JSP 搭配使用

重要事項:系統已不再支援 reCAPTCHA API 1.0 版,請升級至 2.0 版。瞭解詳情

reCAPTCHA Java 程式庫提供放置 CAPTCHA 的簡單方法 以防止漫遊器濫用網站。這個程式庫會納入 reCAPTCHA API

如要搭配 Java/JSP 使用 reCAPTCHA,請下載 reCAPTCHA Java 媒體庫 (由 Soren 提供) 並解壓縮。您通常只需要 jar 檔案 (recaptcha4j-X.X.X.jar),您必須將其複製到可以載入該檔案的位置 。例如,假設您使用 Tomcat 執行 JSP,就可以將 jar 檔案加入 位於 WEB-INF/lib/ 目錄中。

快速入門

註冊 API 金鑰並下載 reCAPTCHA Java 程式庫後,請按照以下基本操作說明 在網站中安裝 reCAPTCHA。

用戶端 (如何讓人機驗證 (Captcha) 圖片顯示)

如要使用 Java 外掛程式顯示 reCAPTCHA 小工具,請匯入 適當的 reCAPTCHA 類別在 JSP 中,請將這幾行程式碼插入 包含會顯示 reCAPTCHA 小工具的表單元素:

    <%@ 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 小工具的 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 查詢,不會使用 存留時間 (TTL) 值,在每個主機的 DNS 記錄中指定的。適用對象 DNS 查詢是傳送給 DNS 伺服器的要求, 可為 IP 位址提供可讀取的主機名稱例如,將 www.recaptcha.net 轉換為 IP 位址 69.12.97.164。當然會比現在更複雜 要瞭解更多資訊,請參閱維基百科的 DNS 是很好的起點。

    reCAPTCHA 伺服器可以變更 IP 位址,但頻率不高。由於 Java 會快取 DNS 否則可能會導致伺服器和 reCAPTCHA 之間的連線中斷 reCAPTCHA IP 位址變更時。在這種情況下,請重新啟動 JVM (例如: Tomcat) 可協助修正問題,因為這會導致系統進行新的 DNS 查詢。不過,您可能不會 因為 reCAPTCHA 驗證問題 因此希望每隔幾個月的時間,在網站故障時重新啟動 JVM 伺服器變更了 IP 位址。

    如要解決這個問題,請將 -Dsun.net.inetaddr.ttl=30 傳遞至 app-server (指示 Java 只快取 DNS 30 秒)。在 Windows 版 Tomcat 中 變更者:

    1. 停止 Tomcat
    2. 前往 tomcat\bin
    3. 執行 Tomcat5w.exe
    4. 前往 Java 分頁
    5. 將 Java 屬性新增至「java options」區段:-Dsun.net.inetaddr.ttl=30
    6. 結束
    7. 啟動 Tomcat

    使用 Linux 或 MacOS X 適用的 Tomcat 時,您必須在指令列中執行下列指令 (然後重新啟動 Tomcat):

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

    這篇文章 進一步說明這個問題

    其他資訊

  • 自訂外觀和風格
  • 提示和規範
  • 疑難排解