Springboot通过谷歌Kaptcha 组件,生成图形验证码

教程

图形验证码属于老生常谈了,具体细节这里就不说了。生成图形验证码的办法非常多,今天讲解一种通过Kaptcha组件快速生成图形验证码的方法。
Kaptcha是谷歌开源的一款简单实用的图形验证码组件。我个人推荐它的最大原因是容易上手,采用约定大于配置的方式,快速契合到项目中。
话不多说,我们看看该如何使用它:

 
  1. <dependency>
  2. <groupId>com.google.code.kaptcha</groupId>
  3. <artifactId>kaptcha</artifactId>
  4. <version>2.3</version>
  5. </dependency>
 
XML
 
 
  1. @Component
  2. public class KaptchaConfig {
  3.  
  4. @Bean
  5. public DefaultKaptcha getDefaultKaptcha(){
  6. com.google.code.kaptcha.impl.DefaultKaptcha defaultKaptcha = new com.google.code.kaptcha.impl.DefaultKaptcha();
  7. Properties properties = new Properties();
  8. properties.put("kaptcha.border", "no");
  9. properties.put("kaptcha.textproducer.font.color", "red");
  10. properties.put("kaptcha.image.width", "213");
  11. properties.put("kaptcha.image.height", "88");
  12. properties.put("kaptcha.textproducer.font.size", "45");
  13. properties.put("kaptcha.session.key", "verifyCode");
  14. properties.put("kaptcha.textproducer.char.space", "6");
  15. properties.put("kaptcha.obscurificator.impl", "com.google.code.kaptcha.impl.WaterRipple");
  16. // properties.put("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");
  17. properties.put("kaptcha.background.clear.from", "yellow");
  18. properties.put("kaptcha.background.clear.to", "green");
  19. Config config = new Config(properties);
  20. defaultKaptcha.setConfig(config);
  21.  
  22. return defaultKaptcha;
  23. }
  24. }
 
java
 
配置名 配置作用 默认值
kaptcha.border 图片边框,合法值:yes , no yes
kaptcha.border.color 边框颜色,合法值: r,g,b (and optional alpha) 或者 white,black,blue. black
kaptcha.image.width 图片宽 200
kaptcha.image.height 图片高 50
kaptcha.producer.impl 图片实现类 com.google.code.kaptcha.impl.DefaultKaptcha
kaptcha.textproducer.impl 文本实现类 com.google.code.kaptcha.text.impl.DefaultTextCreator
kaptcha.textproducer.char.string 文本集合,验证码值从此集合中获取 abcde2345678gfynmnpwx
kaptcha.textproducer.char.length 验证码长度 5
kaptcha.textproducer.font.names 字体 Arial, Courier
kaptcha.textproducer.font.size 字体大小 40px.
kaptcha.textproducer.font.color 字体颜色,合法值: r,g,b 或者 white,black,blue. black
kaptcha.textproducer.char.space 文字间隔 2
kaptcha.noise.impl 干扰实现类 com.google.code.kaptcha.impl.DefaultNoise
kaptcha.noise.color 干扰 颜色,合法值: r,g,b 或者 white,black,blue. black
kaptcha.obscurificator.impl

图片样式:<br />水纹 com.google.code.kaptcha.impl.WaterRipple <br />

鱼眼 com.google.code.kaptcha.impl.FishEyeGimpy <br />

阴影 com.google.code.kaptcha.impl.ShadowGimpy

com.google.code.kaptcha.impl.WaterRipple
kaptcha.background.impl 背景实现类 com.google.code.kaptcha.impl.DefaultBackground
kaptcha.background.clear.from 背景颜色渐变,开始颜色 light grey
kaptcha.background.clear.to 背景颜色渐变, 结束颜色 white
kaptcha.word.impl 文字渲染器 com.google.code.kaptcha.text.impl.DefaultWordRenderer
kaptcha.session.key session key KAPTCHA_SESSION_KEY
kaptcha.session.date session date
 
  1. @GetMapping("/login/getVerifyCode")
  2. public void getVerifyCode(String loginKey,
  3. HttpServletRequest httpServletRequest,
  4. HttpServletResponse httpServletResponse) {
  5. try {
  6. log.warn("query verify Code" + loginKey);
  7. loadService.getVerifyCode(loginKey, httpServletRequest, httpServletResponse);
  8. } catch (Exception e) {
  9. log.error("get verify Code failed :", e);
  10. }
  11. }
 
java
 
 
  1. public void getVerifyCode(String loginKey, HttpServletRequest httpServletRequest,
  2. HttpServletResponse httpServletResponse) throws IOException {
  3. ByteArrayOutputStream imgOutputStream = new ByteArrayOutputStream();
  4. try {
  5. //生产验证码字符串并保存到session中
  6. String verifyCode = captchaProducer.createText();
  7. // httpServletRequest.getSession().setAttribute("verifyCode", verifyCode); // 写入会话
  8. //redisCache.setVerifyInfo(loginKey, verifyCode); //写入redis
  9. captchaMap.put(loginKey, verifyCode);//写入内存
  10. log.warn("reset verify code key {}, code {}", loginKey, verifyCode);
  11. BufferedImage challenge = captchaProducer.createImage(verifyCode);
  12. ImageIO.write(challenge, "jpg", imgOutputStream);
  13. } catch (IllegalArgumentException | IOException e) {
  14. httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
  15. return;
  16. }
  17. byte[] captchaOutputStream = imgOutputStream.toByteArray();
  18. httpServletResponse.setHeader("Cache-Control", "no-store");
  19. httpServletResponse.setHeader("Pragma", "no-cache");
  20. httpServletResponse.setDateHeader("Expires", 0);
  21. httpServletResponse.setContentType("image/jpeg");
  22. try (ServletOutputStream responseOutputStream = httpServletResponse.getOutputStream()) {
  23. responseOutputStream.write(captchaOutputStream);
  24. responseOutputStream.flush();
  25. } catch (IOException ex) {
  26. log.error("find ex in create a new verify Code", ex);
  27. }
  28. }
 
java
 

posted @ 2026-05-06 14:57  charyGao  阅读(20)  评论(0)    收藏  举报