Java/JSP での reCAPTCHA の使用

重要: reCAPTCHA API のバージョン 1.0 のサポートは終了しました。バージョン 2.0 にアップグレードしてください。詳細

reCAPTCHA Java ライブラリを使用すると、Java ベースのウェブサイトに CAPTCHA を配置して bot による悪用を簡単に防ぐことができます。このライブラリは reCAPTCHA API をラップしています。

reCAPTCHA を Java/JSP で使用するには、reCAPTCHA Java ライブラリ(Soren 提供)をダウンロードして解凍します。通常、必要なのは jar ファイル(recaptcha4j-X.X.X.jar)だけです。このファイルは、Java アプリケーションで読み込める場所にコピーする必要があります。たとえば、Tomcat を使用して JSP を実行する場合は、WEB-INF/lib/ というディレクトリに jar ファイルを格納できます。

クイック スタート

API キーを登録して reCAPTCHA Java ライブラリをダウンロードしたら、以下の基本的な手順に沿ってサイトに reCAPTCHA をインストールします。

クライアント サイド(キャプチャ画像の表示方法)

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 に変換します。もちろん、これよりもはるかに複雑です。詳しく知りたい場合は、Wikipedia の DNS に関するエントリをご覧になることをおすすめします。

    頻度は高くありませんが、reCAPTCHA サーバーで IP アドレスが変更されることがあります。Java は DNS ルックアップを永久にキャッシュするため、reCAPTCHA の IP アドレスが変更されると、サーバーと reCAPTCHA 間の接続が停止する可能性があります。その場合は、JVM の再起動(Tomcat の再起動など)によって新しい DNS ルックアップが行われるため、問題が解決することがあります。しかし、reCAPTCHA サーバーが IP アドレスを変更したため、数か月に一度、サイトを中断するたびに JVM を再起動することはおすすめしません。

    この問題を完全に修正するには、-Dsun.net.inetaddr.ttl=30 をアプリサーバーに渡します(これにより Java は DNS を 30 秒間のみキャッシュに保存します)。Tomcat for Windows では

    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"
    

    この問題については、こちらの記事で詳しく説明されています。

    関連情報

  • デザインのカスタマイズ
  • ヒントとガイドライン
  • トラブルシューティング