当前位置: 首页 > news >正文

spring boot3 验证码工具kaptcha使用

1、pom.xml文件,下载验证码工具kaptcha依赖

<!--验证码工具kaptcha的依赖-->
<dependency>
    <groupId>com.github.penggle</groupId>
    <artifactId>kaptcha</artifactId>
    <version>2.3.2</version>
</dependency>

2、创建CaptchaConfig 配置工具类

package com.pn.config;

import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Properties;

/**
 * 验证码工具kaptcha的配置类
 */
@Configuration
public class CaptchaConfig {

    /**
     * 配置Producer接口的实现类DefaultKaptcha的bean对象,该对象用于生成验证码图片;
     * 并给其指定生成的验证码图片的设置项;bean对象的id引用名为captchaProducer;
     */
    @Bean(name = "captchaProducer")
    public DefaultKaptcha captchaProducer() {

        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();

        //properties 属性集对象  -- 对properties文件进行封装,直接再这配置属性,也就是map
        Properties properties = new Properties();
        //是否有边框 默认为true 我们可以自己设置yes,no
        properties.setProperty("kaptcha.border", "yes");
        //边框颜色 默认为Color.BLACK
        properties.setProperty("kaptcha.border.color", "105,179,90");
        //验证码文本字符颜色 默认为Color.BLACK
        properties.setProperty("kaptcha.textproducer.font.color", "blue");
        //验证码图片宽度 默认为200
        properties.setProperty("kaptcha.image.width", "120");
        //验证码图片高度 默认为50
        properties.setProperty("kaptcha.image.height", "40");
        //验证码文本字符大小 默认为40
        properties.setProperty("kaptcha.textproducer.font.size", "32");
        //KAPTCHA_SESSION_KEY
        properties.setProperty("kaptcha.session.key", "kaptchaCode");
        //验证码文本字符间距 默认为2
        properties.setProperty("kaptcha.textproducer.char.space", "4");
        //验证码文本字符长度 默认为5
        properties.setProperty("kaptcha.textproducer.char.length", "4");
        //验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
        properties.setProperty("kaptcha.textproducer.font.names", "Arial,Courier");
        //验证码噪点颜色 默认为Color.BLACK
        properties.setProperty("kaptcha.noise.color", "gray");

        Config config = new Config(properties);

        defaultKaptcha.setConfig(config);

        return defaultKaptcha;
    }
}

3、创建LoginController 控制器使用

package com.pn.controller;

import com.google.code.kaptcha.Producer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.ReactiveRedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.time.Duration;

@RestController
public class LoginController {

    //通过接口拿到kaptcha验证码工具类
    @Resource(name = "captchaProducer")
    private Producer producer;

    //0库
    @Autowired
    @Qualifier("reactiveRedisTemplateDb0")
    private ReactiveRedisTemplate<String, Object> redis;

    @RequestMapping("/captcha/captchaImage")
    public void captchaImage(HttpServletResponse response) throws Exception {
        //ServletOutputStream 实例字节流
        ServletOutputStream out = null;

        try {
            //producer.createText() 生成图片文件
            String text = producer.createText();
            //BufferedImage存放再内存中,producer.createImage() 生成图片
            BufferedImage img = producer.createImage(text);

            //将验证码文本保存到Reids中,设置过期时间,为什么要放key? 多个账号都需要验证码,这样查询对比就方便省事,反正放key就对了
            //博主使用的时Reids异步非阻塞方式,参考博主的Reids异步非阻塞
            //或者使用自己的方式
            //redis.opsForValue().set(text, "",Duration.ofSeconds(20)).subscribe();


            //设置响应头Content - Type 字段设置成 image/jpeg
            response.setContentType("image/jpeg");
            //response.getOutputStream() 开启实例字节流
            out = response.getOutputStream();
            //ImageIO.write()
            ImageIO.write(img, "jpg", out);
            //刷新
            out.flush();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            //关闭字节流
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

相关文章:

  • vue 自制列表,循环滚动
  • python本地连接minio
  • Python:单继承方法的重写
  • (十六) 60s搞懂 : Zookeeper 的详细安装,使用及注意事项
  • Linux多核调度:解锁CPU潜能的密码
  • 环境变量设置异常导致UOS文件管理器无法正常运行
  • 【MySQL数据库】多表查询(笛卡尔积现象,联合查询、内连接、左外连接、右外连接、子查询)-通过练习快速掌握法
  • 计算机网络基础:展望未来网络发展趋势
  • LangChain组件Tools/Toolkits详解(4)——处理ToolException
  • Ollama+Cherrystudio+QwQ 32b部署本地私人问答知识库全测试(2025年3月win11版)
  • 【高并发内存池】第二弹---深入解析高并发内存池与ThreadCache设计
  • php 高性能,高并发,有哪些框架,扩展,推荐一下,或者技术的实现有哪些
  • javascript知识点
  • rip 协议详细介绍
  • LeetCode[19] 删除链表的倒数第 N 个结点
  • 跨境电商IP安全生死线,住宅代理与浏览器指纹攻防实录
  • redis缓存更新策略
  • 【ArduPilot】Windows下使用Optitrack通过MAVProxy连接无人机实现定位与导航
  • 优先队列 priority_queue详解
  • 成都国际数字影像产业园如何打造文创运营新模式​?
  • 上海市税务局:收到对刘某某存在涉税问题的举报,正依法依规办理
  • 龚正市长调研闵行区,更加奋发有为地稳增长促转型,久久为功增强发展后劲
  • 女孩患异食癖爱吃头发,一年后腹痛入院体内惊现“头发巨石”
  • 人民日报:从“轻微免罚”看涉企执法方式转变
  • 4月企业新发放贷款利率处于历史低位
  • 外交部:中方对美芬太尼反制仍然有效