JCaptcha是Java的验证码生成、效验工具,可以提供验证码的字体、文本装饰等功能
其maven依赖为:
com.octo.captcha
jcaptcha
1.0
但是仓库配置上好像有点问题,我配了好几次仓库都不成功,后来再github上找到了源码,本地install成功,才可以使用
github地址:
https://github.com/svn2github/jcaptcha
下载源码,clean->compile->install,发现错误,依赖找不到,发现是父pom中仓库配置的问题,改为:
3rd-party
Repository for 3rd-party artifacts
https://maven.atlassian.com/3rdparty/
true
false
再次编译安装,发现一个com.sun.xxxxxxx包不存在的问题,因为这个包代码太老,所以编译级别有问题,点开问题代码,发现所有问题代码都在一个main方法中,删除这个类即可,这次install成功
本地安装之后,即可在自己项目中使用
下面贴出spring的配置示例:
import com.octo.captcha.CaptchaFactory;
import com.octo.captcha.component.image.backgroundgenerator.*;
import com.octo.captcha.component.image.color.ColorGenerator;
import com.octo.captcha.component.image.color.RandomListColorGenerator;
import com.octo.captcha.component.image.fontgenerator.FontGenerator;
import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator;
import com.octo.captcha.component.image.textpaster.DecoratedRandomTextPaster;
import com.octo.captcha.component.image.textpaster.TextPaster;
import com.octo.captcha.component.image.textpaster.textdecorator.BaffleTextDecorator;
import com.octo.captcha.component.image.textpaster.textdecorator.LineTextDecorator;
import com.octo.captcha.component.image.textpaster.textdecorator.TextDecorator;
import com.octo.captcha.component.image.wordtoimage.ComposedWordToImage;
import com.octo.captcha.component.image.wordtoimage.WordToImage;
import com.octo.captcha.component.word.DictionaryReader;
import com.octo.captcha.component.word.FileDictionary;
import com.octo.captcha.component.word.wordgenerator.DictionaryWordGenerator;
import com.octo.captcha.component.word.wordgenerator.WordGenerator;
import com.octo.captcha.engine.CaptchaEngine;
import com.octo.captcha.engine.GenericCaptchaEngine;
import com.octo.captcha.image.gimpy.GimpyFactory;
import com.octo.captcha.service.captchastore.FastHashMapCaptchaStore;
import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;
import com.octo.captcha.service.image.ImageCaptchaService;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.awt.*;
import java.util.List;
/**
* 图片验证码配置
*/
@Configuration
public class ImageCaptchaConfig {
/* 图片验证码服务 */
@Bean
public ImageCaptchaService imageCaptchaService(CaptchaEngine captchaEngine){
return new DefaultManageableImageCaptchaService(new FastHashMapCaptchaStore(),captchaEngine,180,100000,75000);
}
/* 图片验证码引擎 */
@Bean
public CaptchaEngine captchaEngine(CaptchaFactory captchaFactory){
return new GenericCaptchaEngine(new CaptchaFactory[]{captchaFactory});
}
/* 验证码工厂,控制如何生成验证码 */
@Bean
public CaptchaFactory captchaFactory(WordGenerator wordGenerator,WordToImage wordToImage){
return new GimpyFactory(wordGenerator,wordToImage);
}
/* 单词生成器 */
@Bean
public WordGenerator wordGenerator(DictionaryReader dictionaryReader){
return new DictionaryWordGenerator(dictionaryReader);
}
/* 字典读取器,这里的FileDictionary从jar包自带的resource读取单词 */
@Bean
public DictionaryReader dictionaryReader(){
/* 从jar包自带字典读取单词 */
return new FileDictionary("toddlist");
}
/* 单词转换为图片的组件,需要字体生成器、背景生成器、文本粘贴器 */
@Bean
public WordToImage wordToImage(FontGenerator fontGenerator,BackgroundGenerator backgroundGenerator,TextPaster textPaster){
return new ComposedWordToImage(fontGenerator,backgroundGenerator,textPaster);
}
/* 字体生成器 */
@Bean
public FontGenerator fontGenerator(){
Font hakuyoxingshu = new Font("hakuyoxingshu7000",0,20);
/* 最小最大字体大小 */
return new RandomFontGenerator(40,50,new Font[]{hakuyoxingshu});
}
/* 背景生成器 */
@Bean
public BackgroundGenerator backgroundGenerator(){
return new UniColorBackgroundGenerator(200,60,new Color(120,120,120));
/* 生成效果像蛇皮 */
//return new EllipseBackgroundGenerator(200,60);
/* 背景由红黄绿三种颜色组成 */
//return new FunkyBackgroundGenerator(200,60);
/* 背景为渐变色 */
//return new GradientBackgroundGenerator(200,60,new Color(255,0,0),new Color(0,255,0));
//return new MultipleShapeBackgroundGenerator(200,60);
}
/* TextPaster将文本粘贴到背景上,需要字体颜色 */
@Bean
public TextPaster textPaster(){
//TextDecorator baffle = new BaffleTextDecorator(5,new Color(0,0,0));
TextDecorator line = new LineTextDecorator(2,new Color(0,255,0));
Color blue = new Color(0,0,255);
ColorGenerator generator = new RandomListColorGenerator(new Color[]{blue});
/* 最小最大单词长度 */
return new DecoratedRandomTextPaster(3, 5, generator,new TextDecorator[]{line});
}
}
最后的工具类为:
package com.xidou.common;
import com.octo.captcha.service.CaptchaServiceException;
import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;
import com.octo.captcha.service.image.ImageCaptchaService;
import com.xidou.enums.ExceptionCode;
import com.xidou.vo.BizException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.util.Locale;
@Component
public class ImageCaptchaUtils {
private static final Logger logger = LoggerFactory.getLogger(ImageCaptchaUtils.class);
@Autowired
private ImageCaptchaService instance;
public void getImageCaptcha(HttpServletRequest request, HttpServletResponse response) {
try{
String captchaId = request.getSession().getId();
logger.info("session id is "+captchaId);
BufferedImage challenge = instance.getImageChallengeForID(captchaId,Locale.getDefault());
response.setHeader("Cache-Control", "no-store");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
ServletOutputStream responseOutputStream = response.getOutputStream();
ImageIO.write(challenge, "jpg", responseOutputStream);
responseOutputStream.flush();
responseOutputStream.close();
}catch(Exception ex){
throw new BizException(ExceptionCode.IMAGE_CAPTCHA_GENERATE_ERROR.getCode(),ExceptionCode.IMAGE_CAPTCHA_GENERATE_ERROR.getMsg()+ex);
}
}
public void validateCaptcha(HttpServletRequest request,String code){
Boolean isResponseCorrect =Boolean.FALSE;
String captchaId = request.getSession().getId();
try {
isResponseCorrect = instance.validateResponseForID(captchaId, code);
} catch (CaptchaServiceException ex) {
throw new BizException(ExceptionCode.IMAGE_CAPTCHA_VALIDATE_ERROR.getCode(),ExceptionCode.IMAGE_CAPTCHA_VALIDATE_ERROR.getMsg()+ex);
}
}
}
可见JCaptcha有自己的验证码存储,并且将sessionId与验证码关联起来,这里主要介绍一些JCaptcha常用的组件:
ImageCaptchaService:图片验证码服务,获取BufferedImage、验证验证码都是使用这个组件
CaptchaEngine:包含了多个工厂
CaptchaFactory:验证码工厂,用于生成验证码的各种配置
WordGenerator:单词生成器,用于获取一个随机字符串
DictionaryReader:字典读取器,用于从指定资源读取单词列表
WordToImage:负责单词到图片的组件
BackgroundGenerator:背景生成器,用于生成各种效果的背景,如渐变色等
FontGenerator:字体生成器,用于生成文本字体
TextPaster:文本粘贴器,用于将文本粘贴到图片上
TextDecorator:文本装饰器,用于装饰文本,提高识别难度,有两种效果,一个是给每个字母添加墨点,另一个是给每个字母添加干扰线
ColorGenerator:颜色生成器,通用组件,用于生成一组随机颜色,很多其他组件都使用了这个组件