java(Spring boot)实现获取验证码图片

小咪咪 2023-09-29 17:26 68阅读 0赞

文章目录

    • 一、工具类代码
    • 二、工具类调用
      • 1、获取验证码接口
      • 2、获取验证码接口用于登录验证

一、工具类代码

创建CreateVerifiCodeImage类,将下面代码复制到该类中:

  1. import java.awt.*;
  2. import java.awt.image.BufferedImage;
  3. import java.util.Random;
  4. /**
  5. * @project: ssm_sms
  6. * @description: 绘制验证码图片
  7. */
  8. public class CreateVerifiCodeImage {
  9. private static int WIDTH = 90;
  10. private static int HEIGHT = 35;
  11. private static int FONT_SIZE = 20; //字符大小
  12. private static char[] verifiCode; //验证码
  13. private static BufferedImage verifiCodeImage; //验证码图片
  14. /**
  15. * @description: 获取验证码图片
  16. * @param: no
  17. * @return: java.awt.image.BufferedImage
  18. */
  19. public static BufferedImage getVerifiCodeImage() {
  20. verifiCodeImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_BGR);// create a image
  21. Graphics graphics = verifiCodeImage.getGraphics();
  22. verifiCode = generateCheckCode();
  23. drawBackground(graphics);
  24. drawRands(graphics, verifiCode);
  25. graphics.dispose();
  26. return verifiCodeImage;
  27. }
  28. /**
  29. * @description: 获取验证码
  30. * @param: no
  31. * @return: char[]
  32. */
  33. public static char[] getVerifiCode() {
  34. return verifiCode;
  35. }
  36. /**
  37. * @description: 随机生成验证码
  38. * @param: no
  39. * @return: char[]
  40. */
  41. private static char[] generateCheckCode() {
  42. String chars = "0123456789abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  43. char[] rands = new char[4];
  44. for (int i = 0; i < 4; i++) {
  45. int rand = (int) (Math.random() * (10 + 26 * 2));
  46. rands[i] = chars.charAt(rand);
  47. }
  48. return rands;
  49. }
  50. /**
  51. * @description: 绘制验证码
  52. * @param: g
  53. * @param: rands
  54. * @return: void
  55. */
  56. private static void drawRands(Graphics g, char[] rands) {
  57. g.setFont(new Font("Console", Font.BOLD, FONT_SIZE));
  58. for (int i = 0; i < rands.length; i++) {
  59. g.setColor(getRandomColor());
  60. g.drawString("" + rands[i], i * FONT_SIZE + 10, 25);
  61. }
  62. }
  63. /**
  64. * @description: 绘制验证码图片背景
  65. * @param: g
  66. * @return: void
  67. */
  68. private static void drawBackground(Graphics g) {
  69. g.setColor(Color.white);
  70. g.fillRect(0, 0, WIDTH, HEIGHT);
  71. // 绘制验证码干扰点
  72. for (int i = 0; i < 200; i++) {
  73. int x = (int) (Math.random() * WIDTH);
  74. int y = (int) (Math.random() * HEIGHT);
  75. g.setColor(getRandomColor());
  76. g.drawOval(x, y, 1, 1);
  77. }
  78. }
  79. /**
  80. * @description: 获取随机颜色
  81. * @param: no
  82. * @return: java.awt.Color
  83. */
  84. private static Color getRandomColor() {
  85. Random ran = new Random();
  86. return new Color(ran.nextInt(220), ran.nextInt(220), ran.nextInt(220));
  87. }
  88. }

二、工具类调用

1、获取验证码接口

通过调用工具类getVerifiCodeImage 即可获取到验证码图片

  1. @GetMapping("/getVerifiCodeImage")
  2. public void getVerifiCodeImage(HttpServletRequest request, HttpServletResponse response){
  3. // 获取图片
  4. BufferedImage verifiCodeImage = CreateVerifiCodeImage.getVerifiCodeImage();
  5. // 将验证码图片响应给浏览器
  6. try {
  7. ImageIO.write(verifiCodeImage,"JPEG",response.getOutputStream());
  8. } catch (IOException e) {
  9. e.printStackTrace();
  10. }
  11. }

运行项目,打开浏览器访问该接口地址,页面就会显示生成的验证码图片,刷新验证码,获取的验证码也会随之更新:
在这里插入图片描述

2、获取验证码接口用于登录验证

获取验证码显示在前端后,但验证码功能如登录功能一般还要验证输入的验证码是否正确,即在获取验证码图片的同时,还需获取验证码图片上的值,并将其存储到HttpServletRequest的session域中,用于登录验证。

  1. @GetMapping("/getVerifiCodeImage")
  2. public void getVerifiCodeImage(HttpServletRequest request, HttpServletResponse response){
  3. // 获取图片
  4. BufferedImage verifiCodeImage = CreateVerifiCodeImage.getVerifiCodeImage();
  5. // 获取图片上的验证码
  6. String verifiCode =new String( CreateVerifiCodeImage.getVerifiCode());
  7. // 将验证码文本放入session域,为下一次验证做准备
  8. HttpSession session = request.getSession();
  9. session.setAttribute("verifiCode",verifiCode);
  10. // 将验证码图片响应给浏览器
  11. try {
  12. ImageIO.write(verifiCodeImage,"JPEG",response.getOutputStream());
  13. } catch (IOException e) {
  14. e.printStackTrace();
  15. }
  16. }

在登录接口从HttpServletRequest中获取session里存储的验证码值,并与用户输入的验证码进行校验,校验用户输入的验证码正确即再验证登录的账号即密码是否正确:

  1. @PostMapping("/login")
  2. public Result login(@RequestBody LoginForm loginForm, HttpServletRequest request){
  3. // 验证码校验
  4. HttpSession session = request.getSession();
  5. String sessionVerifiCode = (String)session.getAttribute("verifiCode");
  6. String loginVerifiCode = loginForm.getVerifiCode();
  7. if("".equals(sessionVerifiCode) || null == sessionVerifiCode){
  8. return Result.fail().message("验证码失效,请刷新后重试");
  9. }
  10. if (!sessionVerifiCode.equalsIgnoreCase(loginVerifiCode)){
  11. return Result.fail().message("验证码输入错误,请重新输入!");
  12. }
  13. // 从session域中移除现有验证码
  14. session.removeAttribute("verifiCode");
  15. // 以下可继续进行登录的账号密码等验证逻辑
  16. }

发表评论

表情:
评论列表 (有 0 条评论,68人围观)

还没有评论,来说两句吧...

相关阅读