Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1199134
  • 博文数量: 89
  • 博客积分: 10546
  • 博客等级: 上将
  • 技术积分: 1510
  • 用 户 组: 普通用户
  • 注册时间: 2004-10-16 01:24
文章分类

全部博文(89)

文章存档

2012年(7)

2011年(4)

2010年(5)

2009年(52)

2008年(21)

分类: 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!"));
}

}

运行这个程序进行测试。

阅读(2310) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~