全部博文(89)
分类: Java
2009-03-22 00:40:17
Captcha是Java Completely Automated Public Test to tell Computers and Humans Apart的缩写。Captcha 为了每一次请求生成唯一的验证码,除了有效的防止数据重复提交外,还能够一些跨站的攻击。
JCAPTCHA 提供了 Java 实现。请从 下载最新的稳定版本 1.0。
解压后,将 jcaptcha-all.jar
复制到你的项目的lib中。另外还需要一份 Commons Collections,它是 项目的一部分。解压后,将 commons-collections.jar
文件复制到项目的 lib 目录中。
警告 | |
---|---|
注意Commons Collections 的 3.x 版本与 2.x 版本不兼容,请下载最新的 3.x 版本。 |
我们通过一个 ActionBean
显示验证码图片。
public class CaptchaActionBean extends BaseActionBean {
private final static Log log = LogFactory.getLog(CaptchaActionBean.class);
@DontValidate
@DefaultHandler
@HttpCache(allow=false)
public Resolution display() {
byte[] captchaChallengeAsJpeg = null;
ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
try {
String captchaId = getContext().getRequest().getSession().getId();
if (log.isDebugEnabled()) {
log.debug("=================" + captchaId + "==================");
}
BufferedImage challenge = CaptchaManager.get().getImageChallengeForID(captchaId, getContext().getLocale());
JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream);
jpegEncoder.encode(challenge);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (CaptchaServiceException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
captchaChallengeAsJpeg = jpegOutputStream.toByteArray();
return new StreamingResolution("image/jpeg",
new ByteArrayInputStream(captchaChallengeAsJpeg));
}
}
CaptchaManager 提供ImageCaptchaService 服务接口。
public class CaptchaManager {
private static ImageCaptchaService imageCaptchaService = new DefaultManageableImageCaptchaService();
public static ImageCaptchaService get() {
return imageCaptchaService;
}
}
应用到 JSP 页面,用一个 HTML 标签显示验证码图片。
Verify Code
alt="jCaptcha image"/>
在 RegisterActionBean 中验证是否一致,仍然使用 jCaptcha 提供的方法。
@ValidationMethod(on = "register")
public void verifyCode(ValidationErrors errors) {
String captchaId = getContext().getRequest().getSession().getId();
boolean isResponseCorrect = CaptchaManager.get().validateResponseForID(captchaId, captchaResponse);
if (!isResponseCorrect) {
errors.add("register.captcha.error",
new SimpleError("Captcha code missmatch!"));
}
}
运行这个程序进行测试。