当前位置:   article > 正文

SpringBoot生成图形验证码_springboot 图形验证码

springboot 图形验证码

需求:验证码一码一用,验证之后,不管是成功还是失败,都需要重新获取或者刷新二维码。

大致思路:后端生成验证码后还需要生成一个UUID与之对应,存储到缓存(记得添加过期时间),把UUID和验证码反给前端,登录时后端使用前端传过来的UUID去缓存获取验证码,然后和前端传过来的验证码对比(一般忽略大小写)。

不重复造轮子,使用开源组件,两步完事:

第一步:添加依赖

  1. <!-- 添加图形验证码依赖 -->
  2. <dependency>
  3. <groupId>cn.hutool</groupId>
  4. <artifactId>hutool-captcha</artifactId>
  5. <version>5.8.5</version>
  6. </dependency>

第二步:接口编写

两个接口,两种方式:1.接口直接返回图片。2.接口返回base64字符串。

  1. @Api(tags = "图形验证码-api")
  2. @RequestMapping("/api/gv")
  3. @RestController
  4. public class CaptchaController {
  5. // 模拟缓存
  6. Map<String,String> cache = new HashMap<>();
  7. /**
  8. * 给前端返回一个验证码图片
  9. * @return
  10. */
  11. @ApiOperation("获取图形验证码")
  12. @GetMapping("/identifyImage")
  13. public void identifyImage(HttpServletResponse response,
  14. @ApiParam(value = "图形验证码id,无值:生成验证码,有值:刷新验证码")
  15. @RequestParam(name = "codeId", required = false) String codeId) throws IOException {
  16. //定义图形验证码的长、宽、验证码字符数、干扰元素个数
  17. LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 90, 4, 100);
  18. // 验证码值
  19. String code = lineCaptcha.getCode();
  20. System.out.println("验证码值:" + code);
  21. // 模拟把验证码的值存储到缓存(记得添加过期时间)
  22. if (codeId == null) {
  23. System.out.println("获取图形码");
  24. codeId = ToolUtil.simpleUUID();
  25. // 保存图形码值
  26. cache.put(codeId, code);
  27. } else {
  28. System.out.println("刷新图形码");
  29. // 更新图形码值,此时此刻 图形码可能已经过期删除,那就相对于保存一个新的
  30. cache.put(codeId, code);
  31. }
  32. // 图形验证码对应的UUID,id和验证码一一对应,用于刷新、验证
  33. response.setHeader("codeId", codeId);
  34. // 输出到客户端
  35. try (ServletOutputStream outputStream = response.getOutputStream()) {
  36. // 图形验证码写出,写出到流
  37. lineCaptcha.write(outputStream);
  38. } catch (Exception e) {
  39. System.out.println("图形验证码输出错误");
  40. }
  41. }
  42. /**
  43. * 给前端返回一个base64格式的图片,前端需要转换为图片
  44. * @return
  45. */
  46. @ApiOperation("获取图形验证码base64")
  47. @GetMapping("/identifyImageBase64")
  48. public String identifyImageBase64() {
  49. // 定义图形验证码的长和宽
  50. LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 90, 4, 100);
  51. // 验证码值
  52. String code = lineCaptcha.getCode();
  53. System.out.println("验证码值:" + code);
  54. // 验证码以base64的格式返回到客户端
  55. return lineCaptcha.getImageBase64Data();
  56. }
  57. }

效果展示:

1. 接口直接返回图片。

2. 接口返回base64字符串。

 前端处理后得到图片:

 更多功能和用法可参考详细文档:      Hutool参考文档

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/901925
推荐阅读
相关标签
  

闽ICP备14008679号