• 【案例实战】SpringBoot整合Redis连接池生成图形验证码


    1.需求背景
    • 很多人都用手机注册一些网站的验证了,比如手机验证码。先填手机号,然后发一条验证码过去,输入验证码,完成验证,注册成功。为了避免自己的网站被刷,增加图形验证码。当然为了防止网站被刷还不止这一种办法。
    2.Docker急速部署Redis
    #创建文件夹
    mkdir -p /usr/local/data/redis/data
    
    docker run -itd --name redis -p 6379:6379 -v /usr/local/data/redis/data:/data redis:6.2.4 --requirepass 123456
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    在这里插入图片描述

    3.搭建SpringBoot项目

    (1)添加依赖

        <parent>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-parentartifactId>
            <version>2.6.7version>
            <relativePath/> 
        parent>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
                <scope>testscope>
            dependency>
            <dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
                <version>1.18.20version>
                <scope>compilescope>
            dependency>
        dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    (2)创建启动主类

    @SpringBootApplication
    public class KaptchaApplication {
        public static void main(String[] args) {
            SpringApplication.run(KaptchaApplication.class, args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (3)创建yml

    server:
      port: 8012
    spring:
      application:
        name: kaptcha-server
    
    • 1
    • 2
    • 3
    • 4
    • 5

    (4)启动验证

    在这里插入图片描述

    4.开发图形验证码

    (1)添加Maven依赖

            
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-data-redisartifactId>
                <exclusions>
                    <exclusion>
                        <groupId>io.lettucegroupId>
                        <artifactId>lettuce-coreartifactId>
                    exclusion>
                exclusions>
            dependency>
            <dependency>
                <groupId>redis.clientsgroupId>
                <artifactId>jedisartifactId>
            dependency>
            
            <dependency>
                <groupId>com.baomidougroupId>
                <artifactId>kaptcha-spring-boot-starterartifactId>
                <version>1.1.0version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    (2)yml配置Redis

      # 配置redis
      redis:
        # redis类型,jedis和lettuce
        client-type: jedis
        host: 192.168.139.101
        password: 123456
        port: 6379
        jedis:
          pool:
            # 连接池最大连接数(使用负值表示没有限制)
            max-active: 100
            # 连接池中的最大空闲连接
            max-idle: 100
            # 连接池中的最小空闲连接
            min-idle: 100
            # 连接池最大阻塞等待时间(使用负值表示没有限制)
            max-wait: 60000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    (3)配置CaptchaConfig

    /**
     * 图形验证码配置类
     * @author lixiang
     */
    @Configuration
    public class CaptchaConfig {
    
        /**
         * 验证码配置
         * Kaptcha配置类名
         * @return
         */
        @Bean
        @Qualifier("captchaProducer")
        public DefaultKaptcha kaptcha() {
            DefaultKaptcha kaptcha = new DefaultKaptcha();
            Properties properties = new Properties();
            //properties.setProperty(Constants.KAPTCHA_BORDER, "yes");
            //properties.setProperty(Constants.KAPTCHA_BORDER_COLOR, "220,220,220");
            //properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_COLOR, "38,29,12");
            //properties.setProperty(Constants.KAPTCHA_IMAGE_WIDTH, "147");
            //properties.setProperty(Constants.KAPTCHA_IMAGE_HEIGHT, "34");
            //properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_SIZE, "25");
            //properties.setProperty(Constants.KAPTCHA_SESSION_KEY, "code");
            //验证码个数
            properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
            //properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Courier");
            //字体间隔
            properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_SPACE,"8");
            //干扰线颜色
            //properties.setProperty(Constants.KAPTCHA_NOISE_COLOR, "white");
            //干扰实现类
            properties.setProperty(Constants.KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise");
            //图片样式
            properties.setProperty(Constants.KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.WaterRipple");
            //文字来源
            properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_STRING, "0123456789");
            Config config = new Config(properties);
            kaptcha.setConfig(config);
            return kaptcha;
        }
    }
    
    
    • 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

    (4)配置RedisTemplate

    /**
     * redisTemplate配置类
     * @author lixiang
     */
    @Configuration
    public class RedisTemplateConfiguration {
    
        @Bean
        public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
            RedisTemplate<Object,Object> redisTemplate = new RedisTemplate<>();
    
            redisTemplate.setConnectionFactory(redisConnectionFactory);
    
            //配置序列化规则
            Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
    
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
    
            //设置key-value的序列化规则
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashKeySerializer(jackson2JsonRedisSerializer);
    
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
    
            return redisTemplate;
        }
    
    }
    
    • 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

    (5)编写Controller测试

    @RestController
    @RequestMapping("/kaptcha")
    @Slf4j
    public class KaptchaController {
    
        @Autowired
        private StringRedisTemplate redisTemplate;
    
        @Autowired
        private Producer captchaProducer;
    
        /**
         * 设置过期时间10min
         */
        private static final long CAPTCHA_CODE_EXPIRED = 60 * 1000;
    
        /**
         * 获取图形验证码
         * @param request
         * @param response
         */
        @GetMapping("/get_captcha")
        public void getCaptcha(HttpServletRequest request, HttpServletResponse response){
            //创建验证码内容
            String captchaText = captchaProducer.createText();
            log.info("图形验证码内容为:{}",captchaText);
    
            redisTemplate.opsForValue().set(getCaptchaKey(request),captchaText,CAPTCHA_CODE_EXPIRED, TimeUnit.MILLISECONDS);
            //生成图片
            BufferedImage captchaImage = captchaProducer.createImage(captchaText);
            try(ServletOutputStream outputStream = response.getOutputStream()){
                ImageIO.write(captchaImage,"jpg",outputStream);
            }catch (IOException e){
                log.error("获取流出错:"+e.getMessage());
            }
        }
    
        /**
         * 获取图形验证码的缓存key
         * @param request
         * @return
         */
        private String getCaptchaKey(HttpServletRequest request) {
            String userAgent = request.getHeader("User-Agent");
            return "account:captcha:"+ userAgent;
        }
    
    }
    
    • 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

    在这里插入图片描述

    • 查看redis中的key

    在这里插入图片描述

  • 相关阅读:
    跟着我一起来了解Linux运维
    docker之Harbor私有仓库
    微服务-OpenFeign基本使用
    视频讲解vue2基础之style样式class类名绑定
    芯片生产封装过程简介及概念
    HCIE-Cloud题库
    使用vue-cli搭建spa项目
    ROSIntegration ROSIntegrationVision与虚幻引擎4(Unreal Engine 4)的配置
    代码随想录算法训练营Day41 (day40 休息) | 动态规划(3/17) LeetCode 343. 整数拆分 96.不同的二叉搜索树
    BSCNews报告:Sui网络近期数据激增,生态发展良好
  • 原文地址:https://blog.csdn.net/weixin_47533244/article/details/127820942