JCaptchaによる画像認証

先日、TopHatenarが全ドメイン対応したことで、任意のブログURLを登録できるようになりましたが、そこで画像認証が必要だったので、JCaptchaというライブラリを使用しました。

JCaptcha overview

JavaCAPTCHAライブラリには他にもSimpleCaptchaなどありますが、僕が試した中ではJCaptchaが一番良いと思いました。

使用方法としては、まずImageCaptchaServiceのsingletonインスタンスを用意しておきます。

import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;
import com.octo.captcha.service.image.ImageCaptchaService;

public class Captcha {
    private static ImageCaptchaService service =
        new DefaultManageableImageCaptchaService();

    public static ImageCaptchaService getService() {
        return service;
    }
}

そしてリクエスト時に、固有のIDを使ってチャレンジ画像を生成します。IDは何でも良いですが、ほとんどの場合はセッションIDを使うはずです。

    ImageCaptchaService service = Captcha.getService();
    BufferedImage challenge = service.getImageChallengeForID(session.getId());
    ...

回答がサブミットされたら、チャレンジのときと同じIDを使って検証します。

    ImageCaptchaService service = Captcha.getService();
    Boolean check = service.validateResponseForID(session.getId(), answer);
    if (!Boolean.TRUE.equals(check)) {
        ...
    }

デフォルトで単語辞書とか画像フィルタが適当にセットアップされているので、特に設定しなくても簡単に使えます。ただ、デフォルト設定はちょっと厳しすぎるかもしれないです。↓読めない…。