浅析Java验证码生成库JCaptcha
JCaptcha是非常强大的,不光是可以生成图片式的验证码,还可以生成声音式的(新浪就使用了双重验证码)。本文简单的介绍了JCaptcha库以及使用实例,下面一起来看看。
下载JCaptcha库
maven依赖如此添加:
<dependency> <groupId>com.octo.captcha</groupId> <artifactId>jcaptcha</artifactId> <version>1.0</version> </dependency>
封装了一个简单的类
importcom.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;
importcom.octo.captcha.component.image.backgroundgenerator.FileReaderRandomBackgroundGenerator;
importcom.octo.captcha.component.image.color.RandomListColorGenerator;
importcom.octo.captcha.component.image.fontgenerator.FontGenerator;
importcom.octo.captcha.component.image.fontgenerator.RandomFontGenerator;
importcom.octo.captcha.component.image.textpaster.DecoratedRandomTextPaster;
importcom.octo.captcha.component.image.textpaster.TextPaster;
importcom.octo.captcha.component.image.textpaster.textdecorator.TextDecorator;
importcom.octo.captcha.component.image.wordtoimage.ComposedWordToImage;
importcom.octo.captcha.component.image.wordtoimage.WordToImage;
importcom.octo.captcha.component.word.wordgenerator.RandomWordGenerator;
importcom.octo.captcha.component.word.wordgenerator.WordGenerator;
importcom.octo.captcha.engine.CaptchaEngine;
importcom.octo.captcha.engine.image.ListImageCaptchaEngine;
importcom.octo.captcha.image.gimpy.GimpyFactory;
importjava.awt.*;
/**
*产生验证码图片的类
*/
publicclassCapchaHelper{
privatestaticfinalIntegerMIN_WORD_LENGTH=4;//验证码最小长度
privatestaticfinalIntegerMAX_WORD_LENGTH=4;//验证码最大长度
privatestaticfinalIntegerIMAGE_HEIGHT=30;//验证码图片高度
privatestaticfinalIntegerIMAGE_WIDTH=130;//验证码图片宽度
privatestaticfinalIntegerMIN_FONT_SIZE=15;//验证码最小字体
privatestaticfinalIntegerMAX_FONT_SIZE=15;//验证码最大字体
privatestaticfinalStringRANDOM_WORD="0123456789";//随机字符
//验证码随机字体
privatestaticfinalFont[]RANDOM_FONT=newFont[]{
newFont("nyala",Font.BOLD,MIN_FONT_SIZE),
newFont("Arial",Font.BOLD,MIN_FONT_SIZE),
newFont("BellMT",Font.BOLD,MIN_FONT_SIZE),
newFont("Creditvalley",Font.BOLD,MIN_FONT_SIZE),
newFont("Impact",Font.BOLD,MIN_FONT_SIZE)
};
//验证码随机颜色
privatestaticfinalColor[]RANDOM_COLOR=newColor[]{
newColor(255,255,255),
newColor(255,220,220),
newColor(220,255,255),
newColor(220,220,255),
newColor(255,255,220),
newColor(220,255,220)
};
privatestaticListImageCaptchaEnginecaptchaEngine;
publicstaticCaptchaEnginegetCaptchaEngine(finalStringimgPath){
if(captchaEngine==null){
synchronized(CapchaHelper.class){
if(captchaEngine==null&&imgPath!=null){
captchaEngine=newListImageCaptchaEngine(){
@Override
protectedvoidbuildInitialFactories(){
RandomListColorGeneratorrandomListColorGenerator=newRandomListColorGenerator(RANDOM_COLOR);
BackgroundGeneratorbackgroundGenerator=newFileReaderRandomBackgroundGenerator(IMAGE_WIDTH,IMAGE_HEIGHT,imgPath);
WordGeneratorwordGenerator=newRandomWordGenerator(RANDOM_WORD);
FontGeneratorfontGenerator=newRandomFontGenerator(MIN_FONT_SIZE,MAX_FONT_SIZE,RANDOM_FONT);
TextDecorator[]textDecorator=newTextDecorator[]{};
TextPastertextPaster=newDecoratedRandomTextPaster(MIN_WORD_LENGTH,MAX_WORD_LENGTH,randomListColorGenerator,textDecorator);
WordToImagewordToImage=newComposedWordToImage(fontGenerator,backgroundGenerator,textPaster);
addFactory(newGimpyFactory(wordGenerator,wordToImage));
}
};
}
}
}
returncaptchaEngine;
}
}
响应网页中对验正码图像的请求
可以定义一个servlet响应这个请求,如果用springMVC,也可以用某个Controller中的某个方法响应这个请求,不管怎样,都需要指定一个路径对应到servlet或controller的方法,比如路径是:”/aaa/captcha”
那么在响应对这个路径的请求的Servlet中可以这样写:
//获取验证码背景图片的路径,这路径放了很多作为背景的图像
Stringcaptcha_backgrounds=session.getServletContext().getRealPath("/WEB-INF/img/captcha");
CaptchaEnginece=CapchaHelper.getCaptchaEngine(captcha_backgrounds);
//需要admin网页中用js定时从服务端获取当前的验证码
Captchacaptcha=ce.getNextCaptcha();
//为了验证,把captcha对象放到session中,以在客户端提交验证码时进行验证
req.getSession().setAttribute("captcha",captcha);
//获取验证码图片,这是未压缩的位图
BufferedImageimage=(BufferedImage)captcha.getChallenge();
resp.setContentType("image/jpeg");
ImageIO.write(image,"jpg",resp.getOutputStream());
如果用springMVC,就这样写:
//获取验证码背景图片的路径,这路径放了很多作为背景的图像
Stringcaptcha_backgrounds=session.getServletContext().getRealPath("/WEB-INF/img/captcha");
CaptchaEnginece=CapchaHelper.getCaptchaEngine(captcha_backgrounds);
//需要admin网页中用js定时从服务端获取当前的验证码
Captchacaptcha=ce.getNextCaptcha();
//为了验证,把captcha对象放到session中,以在客户端提交验证码时进行验证
session.setAttribute("captcha",captcha);
//获取验证码图片,这是未压缩的位图
BufferedImageimage=(BufferedImage)captcha.getChallenge();
ByteArrayOutputStreambao=newByteArrayOutputStream();
//应缩成jpg并写到输出流中
ImageIO.write(image,"jpg",bao);
returnbao.toByteArray();
这两种方式,向客户端返回的都是二进制数据。
Stringcaptcha_backgrounds=session.getServletContext().getRealPath(“/WEB-INF/img/captcha”);
表示路径/WEB-INF/img/captcha下面放的是作为验证码图像的背景的多张图片,必须是jpeg,大小可能没限制,你可以自己试一下。
网页中用<IMG>指向这个地址
<imgid="captcha"src="/captcha_img"onclick="refreshCaptchaImg()"/>
js函数refreshCaptchaImg()响应图片的点击,每点击一次,就重新获取一张新的验证码图片。如何重新获取验正码图片呢?
只需改变img的src属性,但这里是每次都是用同一个地址来设置这个属性,这样不会引起真正的刷新,所以方法refreshCaptchaImg()是这样实现的:
functionrefreshCaptchaImg(){
//从服务端重新下载验证码图片
//给这个地加参数纯为了强制刷新,否则由于src指向的url地址没变,浏览器不会真正生刷新图片
varnow=newDate()
$("#captcha").attr("src","/captcha_img?"+now.getTime());
以上就是Java中验证码生成库JCaptcha的介绍及使用,希望对大家学习java有所帮助。