当前位置:   article > 正文

springboot生成图片验证码_springboot 生成图片验证码

springboot 生成图片验证码

springboot生产图片验证码

  • 使用springboot生成一个图片验证码,发送给前端。
  • 如果项目使用springcloud微服务,那么就需要 实现session各服务之间共享!!

工具类

  • 调用放直接调用

      /**
       * @author 遗憾就遗憾吧
       * @version 1.3
       * @Date 2019/9/16
       * @datatime:?serverTimezone=UTC&characterEncoding=utf-8&userSSL=yes
       * @since 1.2
       */
      public class RandomValidateCodeUtil {
      
      
          //TODO 图片验证生成器
      
          public static final String RANDOMCODEKEY= "RANDOMVALIDATECODEKEY";//放到session中的key
      //    private String randString = "0123456789";//随机产生只有数字的字符串 private String
          //private String randString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生只有字母的字符串
          private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生数字与字母组合的字符串
          private int width = 95;// 图片宽
          private int height = 25;// 图片高
          private int lineSize = 40;// 干扰线数量
          private int stringNum = 4;// 随机产生字符数量
      
          private static final Logger logger = LoggerFactory.getLogger(RandomValidateCodeUtil.class);
      
          private Random random = new Random();
      
          /**
           * 获得字体
           */
          private Font getFont() {
              return new Font("Fixedsys", Font.CENTER_BASELINE, 18);
          }
      
          /**
           * 获得颜色
           */
          private Color getRandColor(int fc, int bc) {
              if (fc > 255)
                  fc = 255;
              if (bc > 255)
                  bc = 255;
              int r = fc + random.nextInt(bc - fc - 16);
              int g = fc + random.nextInt(bc - fc - 14);
              int b = fc + random.nextInt(bc - fc - 18);
              return new Color(r, g, b);
          }
      
          /**
           * 生成随机图片
           */
          public void getRandcode(HttpServletRequest request, HttpServletResponse response) {
              HttpSession session = request.getSession();
              // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
              BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
              Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
              g.fillRect(0, 0, width, height);//图片大小
              g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));//字体大小
              g.setColor(getRandColor(110, 133));//字体颜色
              // 绘制干扰线
              for (int i = 0; i <= lineSize; i++) {
                  drowLine(g);
              }
              // 绘制随机字符
              String randomString = "";
              for (int i = 1; i <= stringNum; i++) {
                  randomString = drowString(g, randomString, i);
              }
              logger.info(randomString);
              //将生成的随机字符串保存到session中
              session.removeAttribute(RANDOMCODEKEY);
              session.setAttribute(RANDOMCODEKEY, randomString);
              g.dispose();
              try {
                  // 将内存中的图片通过流动形式输出到客户端
                  ImageIO.write(image, "JPEG", response.getOutputStream());
              } catch (Exception e) {
                  logger.error("将内存中的图片通过流动形式输出到客户端失败>>>> ", e);
              }
      
          }
      
          /**
           * 绘制字符串
           */
          private String drowString(Graphics g, String randomString, int i) {
              g.setFont(getFont());
              g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
                      .nextInt(121)));
              String rand = String.valueOf(getRandomString(random.nextInt(randString
                      .length())));
              randomString += rand;
              g.translate(random.nextInt(3), random.nextInt(3));
              g.drawString(rand, 13 * i, 16);
              return randomString;
          }
      
          /**
           * 绘制干扰线
           */
          private void drowLine(Graphics g) {
              int x = random.nextInt(width);
              int y = random.nextInt(height);
              int xl = random.nextInt(13);
              int yl = random.nextInt(15);
              g.drawLine(x, y, x + xl, y + yl);
          }
      
          /**
           * 获取随机的字符
           */
          public String getRandomString(int num) {
              return String.valueOf(randString.charAt(num));
          }
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113

调用过程

  • 返回值 : void

      //TODO 修改密码获取 验证码图片
      /**
       * 生成验证码
       */
      @RequestMapping(value = "/getVerify")
      public void getVerify(HttpServletRequest request, HttpServletResponse response) {
          try {
              response.setContentType("image/jpeg");//设置相应类型,告诉浏览器输出的内容为图片
              response.setHeader("Pragma", "No-cache");//设置响应头信息,告诉浏览器不要缓存此内容
              response.setHeader("Cache-Control", "no-cache");
              response.setDateHeader("Expire", 0);
              RandomValidateCodeUtil randomValidateCode = new RandomValidateCodeUtil();
              randomValidateCode.getRandcode(request, response);//输出验证码图片方法
          } catch (Exception e) {
              e.printStackTrace();
          }
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

前台调用:

  • 在img的 src中,直接输入当前 controller的getVerify 路劲即可

      <img src="/user/getVerify" id="imgCode">
    
    • 1
  • 实现点击图片,进行更换 验证码图片:

      //在getVerify 路径之后 + ?Math.random(); 随机数参数,来确保每次请求路径不一致
    
      //当验证码图片点击时更换验证码
      //获取验证码
      function getVerify(obj){
      	obj.src = "/user/getVerify?"+Math.random();
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/901936
推荐阅读
相关标签
  

闽ICP备14008679号