Spring Boot实战之Redis缓存登录验证码

Posted -wanglei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot实战之Redis缓存登录验证码相关的知识,希望对你有一定的参考价值。

1.工具类

 1 import lombok.experimental.UtilityClass;
 2 
 3 import java.awt.*;
 4 import java.awt.image.BufferedImage;
 5 import java.util.Random;
 6 
 7 @UtilityClass
 8 public class CaptchaUtil 
 9 
10 
11     private int width = 200;
12     private int height = 50;
13 
14 
15     public BufferedImage createImage()
16         //生成对应宽高的初始图片
17         return  new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
18     
19 
20     public String drawRandomText(BufferedImage verifyImg) 
21         Graphics2D graphics = (Graphics2D) verifyImg.getGraphics();
22         //设置画笔颜色-验证码背景色
23         graphics.setColor(Color.WHITE);
24         //填充背景
25         graphics.fillRect(0, 0, width, height);
26         graphics.setFont(new Font("微软雅黑", Font.PLAIN, 30));
27         //数字和字母的组合
28         String baseNumLetter = "123456789abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";
29         StringBuilder sBuffer = new StringBuilder();
30         //旋转原点的 x 坐标
31         int x = 10;
32         String ch = "";
33         Random random = new Random();
34         for (int i = 0; i < 4; i++) 
35             graphics.setColor(getRandomColor());
36             //设置字体旋转角度
37             //角度小于30度
38             int degree = random.nextInt() % 30;
39             int dot = random.nextInt(baseNumLetter.length());
40             ch = baseNumLetter.charAt(dot) + "";
41             sBuffer.append(ch);
42             //正向旋转
43             graphics.rotate(degree * Math.PI / 180, x, 45);
44             graphics.drawString(ch, x, 45);
45             //反向旋转
46             graphics.rotate(-degree * Math.PI / 180, x, 45);
47             x += 48;
48         
49 
50         //画干扰线
51         for (int i = 0; i < 6; i++) 
52             // 设置随机颜色
53             graphics.setColor(getRandomColor());
54             // 随机画线
55             graphics.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height));
56         
57         //添加噪点
58         for (int i = 0; i < 30; i++) 
59             int x1 = random.nextInt(width);
60             int y1 = random.nextInt(height);
61             graphics.setColor(getRandomColor());
62             graphics.fillRect(x1, y1, 2, 1);
63         
64         return sBuffer.toString();
65     
66 
67     /**
68      * 随机取色
69      */
70     private Color getRandomColor() 
71         Random ran = new Random();
72         return new Color(ran.nextInt(256), ran.nextInt(256), ran.nextInt(256));
73 
74     
75 

2.controller类

 @GetMapping("/captcha.jpg")
    public void captcha(HttpServletResponse response, HttpServletRequest request) throws IOException 
        response.setHeader("Cache-Control", "no-store, no-cache");
        response.setContentType("image/jpeg");
        // 生成图片验证码
        BufferedImage image = CaptchaUtil.createImage();
        // 生成文字验证码
        String randomText = CaptchaUtil.drawRandomText(image);
        // 保存到验证码到 redis 有效期两分钟
        String t = request.getParameter("t");
        redisTemplate.opsForValue().set(key + t, randomText.toLowerCase(), 2, TimeUnit.MINUTES);
        ServletOutputStream out = response.getOutputStream();
        ImageIO.write(image, "jpeg", out);
    

3.前端代码

refreshCaptcha: function() 
      this.loginForm.code = ‘‘
      this.loginForm.t = new Date().getTime()
      this.src = ‘http://localhost:8081/captcha.jpg?t=‘ + this.loginForm.t
    

4.redis配置

#Redis配置
## Redis数据库索引(默认为0)
spring.redis.database=1
# Redis服务器地址
spring.redis.host=47.98.184.17
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码
spring.redis.password=root
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=30000ms
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=1
# 连接超时时间(毫秒)
spring.redis.timeout=6000ms

 

以上是关于Spring Boot实战之Redis缓存登录验证码的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot下的Redis缓存实战

微服务 Spring Boot 整合Redis 实战开发解决高并发数据缓存

spring boot项目之redis缓存

spring boot 使用redis 管理用户会员登录

spring boot项目之登陆缓存session至redis和cookies

spring boot项目之登出删除缓存session至redis和cookies