0


springboot验证码的生成与验证

🐋前言:在springboot的登陆页面中为了防止机器大规模注册,机器暴力破解数据密码等危害,需要验证随机生成的验证码。现提出两种简易方案生成验证码功能,一种采用springboot整合kaptcha第三方验证码生成工具的生成方案;另一种采用springboot整合第三方类库hutool生成验证码,验证成功跳转至success页面,失败则跳转false页面。基本实现方案如下:


🐬 目录:


🐇效果一览(单击图片刷新验证码)

在这里插入图片描述

一、使用整合kaptcha方式实现验证码生成与验证

🐪 kaptcha是一个可高度适配的使用验证码生成工具,Kaptcha详细配置表如下:

参考博客:Kaptcha
Constantdescriptiondefaultkaptcha.border图片边框,合法值:yes,noyeskaptcha.border.color边框颜色,合法值: r,g,b (and optional alpha) 或者 white,black,blue.blackkaptcha.image.width图片宽200kaptcha.image.height图片高50kaptcha.producer.impl图片实现类com.google.code.kaptcha.impl.DefaultKaptchakaptcha.textproducer.impl文本实现类com.google.code.kaptcha.text.impl.DefaultTextCreatorkaptcha.textproducer.char.string文本集合,验证码值从此集合中获取abcde2345678gfynmnpwxkaptcha.textproducer.char.length验证码长度5kaptcha.textproducer.font.names字体Arial, Courierkaptcha.textproducer.font.size字体大小40px.kaptcha.textproducer.font.color字体颜色,合法值: r,g,b 或者 white,black,blue.blackkaptcha.textproducer.char.space文字间隔2kaptcha.noise.impl干扰实现类com.google.code.kaptcha.impl.DefaultNoisekaptcha.noise.color干扰 颜色,合法值: r,g,b 或者 white,black,blue.blackkaptcha.obscurificator.impl图片样式:
水纹 com.google.code.kaptcha.impl.WaterRipple
鱼眼 com.google.code.kaptcha.impl.FishEyeGimpy
阴影 com.google.code.kaptcha.impl.ShadowGimpycom.google.code.kaptcha.impl.WaterRipplekaptcha.background.impl背景实现类com.google.code.kaptcha.impl.DefaultBackgroundkaptcha.background.clear.from背景颜色渐变,开始颜色light greykaptcha.background.clear.to背景颜色渐变, 结束颜色whitekaptcha.word.impl文字渲染器com.google.code.kaptcha.text.impl.DefaultWordRendererkaptcha.session.keysession keyKAPTCHA_SESSION_KEYkaptcha.session.datesession dateKAPTCHA_SESSION_DATE

1.1 pom文件中导入kaptcha依赖

💬 新建springboot项目,并在其pom.xml中导入kaptcha依赖:

  1. <dependency>
  2. <groupId>com.github.penggle</groupId>
  3. <artifactId>kaptcha</artifactId>
  4. <version>2.3.2</version>
  5. </dependency>

1.2 创建前端页面与跳转页面

💬 前端页面index.html

  1. <h2>kaptcha验证码验证</h2>
  2. <form action="/loginh" method="post">
  3. <input type="text" name="verifyCode" placeholder="请输入验证码" required="true">
  4. <img alt="单击图片刷新!" class="pointer" src="/common/kaptcha"
  5. onclick="this.src='/common/kaptcha?d='+new Date()*1">
  6. </br>
  7. <button type="submit" value="submit">登陆</button>
  8. </form>

💬 跳转页面success.html

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <h2>success</h2>
  9. </body>
  10. </html>

1.3 实现后端代码

1.3.1 注入keptcha配置类

💬 创建配置类KaptchaConfig.java

  1. package com.allin.config;
  2. import com.google.code.kaptcha.impl.DefaultKaptcha;
  3. import com.google.code.kaptcha.util.Config;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.stereotype.Component;
  6. import java.util.Properties;
  7. @Component
  8. public class KaptchaConfig {
  9. @Bean
  10. public DefaultKaptcha getDefaultKaptcha(){
  11. com.google.code.kaptcha.impl.DefaultKaptcha defaultKaptcha = new com.google.code.kaptcha.impl.DefaultKaptcha();
  12. Properties properties = new Properties();
  13. properties.put("kaptcha.border", "no");
  14. properties.put("kaptcha.textproducer.font.color", "black");
  15. properties.put("kaptcha.image.width", "150");
  16. properties.put("kaptcha.image.height", "40");
  17. properties.put("kaptcha.textproducer.font.size", "30");
  18. properties.put("kaptcha.session.key", "verifyCode");
  19. properties.put("kaptcha.textproducer.char.space", "5");
  20. Config config = new Config(properties);
  21. defaultKaptcha.setConfig(config);
  22. return defaultKaptcha;
  23. }
  24. }
1.3.2 创建后端控制类生成验证码

💬 创建控制类CommonController类,一方面通过流的方式将随机生成的验证码图片信息发送到前端浏览器;另一方面将验证码中的验证信息写入session中,以方便后续的验证

  1. package com.allin.controller;
  2. import com.google.code.kaptcha.impl.DefaultKaptcha;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import javax.imageio.ImageIO;
  7. import javax.servlet.ServletOutputStream;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. import java.awt.image.BufferedImage;
  11. import java.io.ByteArrayOutputStream;
  12. @Controller
  13. public class CommonController {
  14. @Autowired
  15. private DefaultKaptcha captchaProducer;
  16. @GetMapping("/common/kaptcha")
  17. public void defaultKaptcha(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
  18. byte[] captchaOutputStream = null;
  19. ByteArrayOutputStream imgOutputStream = new ByteArrayOutputStream();
  20. try {
  21. //生产验证码字符串并保存到session中
  22. String verifyCode = captchaProducer.createText();
  23. httpServletRequest.getSession().setAttribute("verifyCode", verifyCode);
  24. BufferedImage challenge = captchaProducer.createImage(verifyCode);
  25. ImageIO.write(challenge, "jpg", imgOutputStream);
  26. } catch (IllegalArgumentException e) {
  27. httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
  28. return;
  29. }
  30. captchaOutputStream = imgOutputStream.toByteArray();
  31. httpServletResponse.setHeader("Cache-Control", "no-store");
  32. httpServletResponse.setHeader("Pragma", "no-cache");
  33. httpServletResponse.setDateHeader("Expires", 0);
  34. httpServletResponse.setContentType("image/jpeg");
  35. ServletOutputStream responseOutputStream = httpServletResponse.getOutputStream();
  36. responseOutputStream.write(captchaOutputStream);
  37. responseOutputStream.flush();
  38. responseOutputStream.close();
  39. }
  40. }
1.3.3 实现验证码的验证与页面跳转

💬 对前端输入的数据并发送到服务器的验证信息进行校验,当输入信息与验证码信息一致则跳转至success.html页面,否则跳转至false.html页面

  1. @Controller
  2. public class AdminController {
  3. @PostMapping("/loginh")
  4. public String loginByKaptcha(@RequestParam("verifyCode") String verifyCode,
  5. HttpSession session){
  6. String kaptchaCode = session.getAttribute("verifyCode") + "";
  7. if(verifyCode.equals(kaptchaCode)){
  8. return "success";
  9. }
  10. return "false";
  11. }
  12. }

一、使用hutool-captcha方式实现验证码生成与验证

🏆Hutool是一个Java工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法,让Java语言也可以“甜甜的”。Hutool最初是我项目中“util”包的一个整理,后来慢慢积累并加入更多非业务相关功能,并广泛学习其它开源项目精髓,经过自己整理修改,最终形成丰富的开源工具集

Hutool参考文档

1.1 pom文件中导入hutool-captcha依赖

💬 新建springboot项目,并在其pom.xml中导入hutool-captcha依赖:

  1. <dependency>
  2. <groupId>cn.hutool</groupId>
  3. <artifactId>hutool-all</artifactId>
  4. <version>5.8.1</version>
  5. </dependency>

1.2 创建前端页面与跳转页面

💬 前端页面index.html

  1. <h2>Hutool-captcha验证码验证</h2>
  2. <form action="/loginc" method="post">
  3. <input type="text" name="verifyCode" placeholder="请输入验证码" required="true">
  4. <img alt="单击图片刷新!" class="pointer" src="/common/verify"
  5. onclick="this.src='/common/verify?d='+new Date()*1">
  6. </br>
  7. <button type="submit" value="submit">登陆</button>
  8. </form>

💬 跳转页面success.html

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <h2>success</h2>
  9. </body>
  10. </html>

1.3 实现后端代码

1.3.1 创建后端控制类生成验证码

💬 创建控制类CommonController类,一方面通过流的方式将随机生成的验证码图片信息发送到前端浏览器;另一方面将验证码中的验证信息写入session中,以方便后续的验证

  1. @RestController
  2. public class HutoolController {
  3. @GetMapping("/common/verify")
  4. public void Verify(HttpServletRequest request,HttpServletResponse response) throws IOException {
  5. //定义图形验证码的长、宽、验证码字符数、干扰线宽度
  6. ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(150, 40, 5, 4);
  7. //图形验证码写出,可以写出到文件,也可以写出到流
  8. captcha.write(response.getOutputStream());
  9. //获取验证码中的文字内容
  10. String verifyCode = captcha.getCode();
  11. request.getSession().setAttribute("verifyCode",verifyCode);
  12. }
1.3.3 实现验证码的验证与页面跳转

💬 对前端输入的数据并发送到服务器的验证信息进行校验,当输入信息与验证码信息一致则跳转至success.html页面,否则跳转至false.html页面

  1. @Controller
  2. public class AdminController {
  3. @PostMapping("/loginc")
  4. public String loginByHutool(@RequestParam("verifyCode") String verifyCode,
  5. HttpSession session){
  6. String captchaCode = session.getAttribute("verifyCode") + "";
  7. if(verifyCode.equals(captchaCode)){
  8. return "success";
  9. }
  10. return "false";
  11. }
  12. }
标签: spring boot java 后端

本文转载自: https://blog.csdn.net/lucklycoder/article/details/125509521
版权归原作者 妙乌 所有, 如有侵权,请联系我们删除。

“springboot验证码的生成与验证”的评论:

还没有评论