jcaptcha验证码
导入依赖
<dependency>
<groupId>com.octo.captcha</groupId>
<artifactId>jcaptcha</artifactId>
<version>1.0</version>
</dependency>
工具包
JCaptchaUtil的工具包,新建util,新建JCaptchaUtil类,生成验证码
public class JCaptchaUtil {
private static final ImageCaptchaService SERVICE =imageCaptchaService();
public static ImageCaptchaService getService(){
return SERVICE;
}
private static ImageCaptchaService imageCaptchaService(){
//背景
UniColorBackgroundGenerator backgroundGenerator =new UniColorBackgroundGenerator(100,50);
//字
//给字随机生成一种颜色,三原色的范围是三个数组
RandomRangeColorGenerator textColor = new RandomRangeColorGenerator(new int[]{0,100},new int[]{100,200},new int[]{150,250});
//随机生成字的个数 4个或者五个,字的颜色为 textColor
RandomTextPaster randomTextPaster =new RandomTextPaster(4,4,textColor);
//字的大小 字体
RandomFontGenerator randomFontGenerator = new RandomFontGenerator(20,30);
//组装图像 字体+背景+字
ComposedWordToImage composedWordToImage=new ComposedWordToImage(randomFontGenerator,backgroundGenerator,randomTextPaster);
//设置字的形状为toddlist
ComposeDictionaryWordGenerator cdwg =new ComposeDictionaryWordGenerator(new FileDictionary("toddlist"));
//组装
GimpyFactory gf =new GimpyFactory(cdwg,composedWordToImage);
//生成一个GenericCaptchaEngine引擎
GenericCaptchaEngine gce =new GenericCaptchaEngine(new CaptchaFactory[]{gf});
//有效时间为20,最大的存储大小为2000,
return new GenericManageableCaptchaService(gce,20,2000,2000);
}
}
控制层
利用session的唯一性来保证验证码的每次请求得到刷新,调用JCaptchaUtil类
@GetMapping("/generator")
@TokenCheck(required = false)
public void generatorJcaptcha(HttpServletRequest request, HttpServletResponse response){
try {
//获取每次请求的session id 用来保证每次请求验证码的唯一性
String id = request.getSession().getId();
BufferedImage bufferedImage = JCaptchaUtil.getService().getImageChallengeForID(id);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(byteArrayOutputStream);
jpegEncoder.encode(bufferedImage);
response.setHeader("Cache-Control","no-store");
response.setContentType("image/jpeg");
byte[] bytes = byteArrayOutputStream.toByteArray();
ServletOutputStream servletOutputStream = response.getOutputStream();
servletOutputStream.write(bytes);
servletOutputStream.flush();
servletOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
生成验证码
校验
由于validateResponseForID中存有验证码的值调用JCaptchaUtil.getService().validateResponseForID(sessionID,验证码)验证即可
//校验验证码
@GetMapping("/verify")
@TokenCheck(required = false)
public String verify(String verifyCode, HttpServletRequest request){
System.out.println("校验验证码");
Boolean aBoolean = JCaptchaUtil.getService().validateResponseForID(request.getSession().getId(), verifyCode);
if (aBoolean){
return "验证码校验通过";
}
return "验证码校验失败";
}
校验通过
校验失败
报错记录
导入依赖spring boot启动问题
依赖错误
将pom文件依赖改成,即可正常运行
<dependency>
<groupId>com.octo.captcha</groupId>
<artifactId>jcaptcha</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
</exclusions>
</dependency>