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));
          }
      }
    

调用过程

  • 返回值 : 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();
          }
      }
    

前台调用:

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

      
    
  • 实现点击图片,进行更换 验证码图片:

      //在getVerify 路径之后 + ?Math.random(); 随机数参数,来确保每次请求路径不一致
    
      //当验证码图片点击时更换验证码
      //获取验证码
      function getVerify(obj){
      	obj.src = "/user/getVerify?"+Math.random();
      }
    

你可能感兴趣的:(springboot)