栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot做图形验证码

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot做图形验证码

生成随机码和图片的工具类

package com.lixianhe.utils;
 ​
 import com.lixianhe.SpringBootUser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.data.redis.core.ValueOperations;
 ​
 import javax.imageio.ImageIO;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.util.Random;
 import java.util.concurrent.TimeUnit;
 ​
 public class RandomValidateCodeUtil {
 ​
     private static final Logger logger = LoggerFactory.getLogger(RandomValidateCodeUtil.class);
     
     // 随机产生数字与字母组合的字符串
     private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 ​
     private int width = 95;// 图片宽
     private int height = 25;// 图片高
     private int lineSize = 40;// 干扰线数量
     private int stringNum = 4;// 随机产生字符数量
     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 getRandomCode(String username, HttpServletRequest request, HttpServletResponse response) {
 ​
         HttpSession session = request.getSession();
 ​
         // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
         BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
 ​
         // 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
         Graphics g = image.getGraphics();
 ​
         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++) {
             drawLine(g);
         }
 ​
         // 绘制随机字符
         String randomString = "";
 ​
         for (int i = 1; i <= stringNum; i++) {
             randomString = drawString(g, randomString, i);
         }
 ​
         // 数据存入到Redis
         ValueOperations stringStringValueOperations = SpringBootUser.redisTemplateDefault.opsForValue();
 ​
         System.out.println(SpringBootUser.redisTemplateDefault);
 ​
         stringStringValueOperations.set(username,randomString,2, TimeUnit.MINUTES);
 ​
         g.dispose();
 ​
         try {
             // 将内存中的图片通过流动形式输出到客户端
             ImageIO.write(image, "JPEG", response.getOutputStream());
         } catch (Exception e) {
             logger.error("将内存中的图片通过流动形式输出到客户端失败>>>>   ", e);
         }
 ​
     }
 ​
     
     private String drawString(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 drawLine(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));
     }
 }

Controller层

 package com.lixianhe.controller;
 ​
 import com.alibaba.fastjson.JSONObject;
 import com.lixianhe.SpringBootUser;
 import com.lixianhe.utils.RandomValidateCodeUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.data.redis.core.ValueOperations;
 import org.springframework.web.bind.annotation.*;
 ​
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 @RestController
 @RequestMapping("/login")
 public class PicVerifyAction {
 ​
     private final static Logger logger = LoggerFactory.getLogger(PicVerifyAction.class);
 ​
     
     @RequestMapping(value = "/getVerify/{username}")
     public void getVerify(@PathVariable String username, HttpServletRequest request, HttpServletResponse response) {
 ​
         System.out.println(SpringBootUser.redisTemplateDefault);
 ​
         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.getRandomCode(username, request, response);//输出验证码图片方法
 ​
         } catch (Exception e) {
             logger.error("获取验证码失败>>>>   ", e);
         }
     }
 ​
     
     @RequestMapping(value = "/checkVerify", method = RequestMethod.POST, headers = "Accept=application/json")
     public int checkVerify(@RequestBody JSONObject jsonObject) {
         // 响应的状态
         int status = 0;
         // 用户名
         String username = (String)jsonObject.get("username");
         // 用户输入的验证码
         String code = (String)jsonObject.get("code");
         try {
             // 从redis数据库中获取并比较
             ValueOperations stringOperations = SpringBootUser.redisTemplateDefault.opsForValue();
             String res = stringOperations.get(username);
             if(res != null && res.equals(code)){
                 status = 1;
             }
 ​
         } catch (Exception e) {
             logger.error("验证码校验失败", e);
             return status;
         }
         
         return status;
     }
 ​
 }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/854162.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号