重要: 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_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 に変換します。もちろん、これよりもはるかに複雑です。詳しく知りたい場合は、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 では
- Tomcat を停止する
- tomcat\bin に移動します。
- Tomcat5w.exe を実行します
- [Java] タブに移動
- java プロパティを Java オプション セクションに追加: -Dsun.net.inetaddr.ttl=30
- 終了
- Tomcat を起動する
Linux または MacOS X 用の Tomcat では、コマンドラインで次のコマンドを実行して、Tomcat を再起動する必要があります。
export JAVA_OPTS="$JAVA_OPTS -Dsun.net.inetaddr.ttl=30"
この問題については、こちらの記事で詳しく説明されています。