Java 图形验证码
图形验证码是最经典,也是最常用的验证方式。介绍一个非常不错的类库:Java图形验证码,支持gif、中文、算术等类型,可用于Java Web、JavaSE等项目。
官网:https://gitee.com/whvse/EasyCaptcha
效果图:
image.png

项目引入easy-captcha

  1. <dependencies>
  2. <dependency>
  3. <groupId>com.github.whvcse</groupId>
  4. <artifactId>easy-captcha</artifactId>
  5. <version>1.6.2</version>
  6. </dependency>
  7. </dependencies>

SpringBoot项目创建图形验证码

前后端分离项目中建议不要存储在session中;而使用分布式session,存储在redis中,redis存储需要一个key,key一同返回给前端用于验证输入。

  1. @Controller
  2. public class CaptchaController {
  3. @Autowired
  4. private RedisUtil redisUtil;
  5. @ResponseBody
  6. @RequestMapping("/vcode/captcha")
  7. public JsonResult captcha(HttpServletRequest request, HttpServletResponse response) throws Exception {
  8. SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 5);
  9. String verCode = specCaptcha.text().toLowerCase();
  10. String key = UUID.randomUUID().toString();
  11. // 存入redis并设置过期时间为30分钟
  12. redisUtil.setEx(key, verCode, 30, TimeUnit.MINUTES);
  13. // 将key和base64返回给前端
  14. return JsonResult.ok().put("key", key).put("image", specCaptcha.toBase64());
  15. }
  16. @ResponseBody
  17. @PostMapping("/vcode/vaild")
  18. public JsonResult login(String username,String password,String verCode,String verKey){
  19. // 获取redis中的验证码
  20. String redisCode = redisUtil.get(verKey);
  21. // 判断验证码
  22. if (verCode==null || !redisCode.equals(verCode.trim().toLowerCase())) {
  23. return JsonResult.error("验证码不正确");
  24. }
  25. }
  26. }

前端使用ajax获取验证码并验证

  1. <img id="verImg" width="130px" height="48px"/>
  2. <script>
  3. var verKey;
  4. // 获取验证码
  5. $.get('/vcode/captcha', function(res) {
  6. verKey = res.key;
  7. $('#verImg').attr('src', res.image);
  8. },'json');
  9. // 登录
  10. $.post('/vcode/login', {
  11. verKey: verKey,
  12. verCode: '8u6h',
  13. username: 'admin'
  14. password: 'admin'
  15. }, function(res) {
  16. console.log(res);
  17. }, 'json');
  18. </script>

Java实现图形验证码-支持gif、中文、算术 - 图2