Kaptcha作为开源类库,可以用来生成在注册账户时所需的验证码图片。
在pom中的配置
<!--Kaptcha是用于生成验证码的开源类库-->
<dependency>
<groupId>com.google.code.kaptcha</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3</version>
<classifier>jdk15</classifier>
</dependency>
但是Kaptcha并不在中央仓库中,需要到Sonatype Forge仓库中下载,在pom中配置如下:
<!--Kaptcha并没有上传到中央仓库,可以从Sonatype Forge仓库获得该构件-->
<repositories>
<repository>
<id>sonatype-forge</id>
<name>Sonatype Forge</name>
<url>http://repository.sonatype.org/content/groups/forge/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
整个业务流程是:
0、初始化验证码生成器
//类实现InitializingBean,在初始化对象的时候,调用afterPropertiesSet方法,初始化验证码生成器producer
//并提供默认配置
private DefaultKaptcha producer;
public void afterPropertiesSet(){
producer=new DefaultKaptcha();
producer.setConfig(new Config(new Properties()));
}
1、生成验证码主键 和 验证码值,并构成Map
//产生验证码主键 和 验证码值,放在Map中
private Map<String,String> captchaMap=new HashMap<String, String>();
public String generateCaptchaKey(){
String key=getRandomString();
//产生验证码值
String value=producer.createText();
captchaMap.put(key,value);
return key;
}
//产生验证码主键
public String getRandomString(){
String range="0123456789abcdefghijklmnopqrstuvwxyz";
Random random=new Random();
StringBuffer sb=new StringBuffer();
for(int i=0;i<6;i++){
sb.append(range.charAt(random.nextInt(range.length())));
}
return sb.toString();
}
2、生成验证码图片
//产生验证码图片
public byte[] generateCaptchaImage(String captchaKey){
String value=captchaMap.get(captchaKey);
BufferedImage image=producer.createImage(value);
ByteArrayOutputStream out=new ByteArrayOutputStream();
//或者保存到本地
// OutputStream output=new FileOutputStream(new File(""));
//output.write()
try{
ImageIO.write(image,"jpg",out);
}catch (Exception e){
e.printStackTrace();
}
return out.toByteArray();
}
3、验证结果
//验证结果
public boolean validateCaptcha(String captchaKey,String captchaValue){
String value=captchaMap.get(captchaKey);
if(value.equals(captchaValue)){
captchaMap.remove(captchaKey);
return true;
}else{
return false;
}
}