首页 > 其他分享 >spring boot 图文验证码(Kaptcha)使用

spring boot 图文验证码(Kaptcha)使用

时间:2023-01-16 17:22:16浏览次数:61  
标签:KAPTCHA chinese spring boot NUMBER Kaptcha setProperty properties append

如何使用
可以直接去官网http://code.google.com/p/kaptcha/下载jar,或者在pom.xml中导入
`

		<groupId>com.baomidou</groupId>

		<artifactId>kaptcha-spring-boot-starter</artifactId>

		<version>1.1.0</version>

	</dependency>

`
Kaptcha 详细配置表

业务代码


@Service
public class CaptchaService extends BaseService {
    @Resource(name = "captchaProducerMath")
    private Producer captchaProducerMath;
 
    @Autowired
    RedisOps redisOps;
 
 
    /**
     * 生成图片验证码
     */
    public DataRespBean<Map<String, Object>> getPictureCaptcha(HttpServletResponse response) throws IOException {
        String uuid = UUID.randomUUID().toString();
        String capStr = null, code = null;
        BufferedImage image = null;
        // 生成验证码
        String capText = captchaProducerMath.createText();
        //截取结果
        capStr = capText.substring(0, capText.lastIndexOf("@"));
        code = capText.substring(capText.lastIndexOf("@") + 1);
        image = captchaProducerMath.createImage(capStr);
        //结果存入redis,key为uuid 超时时间5分钟
        redisOps.set(RedisUtil.pictureCaptchaKey(uuid), code, 5 * 60); // 5分钟
        // 转换流信息写出
        FastByteArrayOutputStream outputStream= new FastByteArrayOutputStream();
        Map<String, Object> map = new HashMap<>();
        try {
            ImageIO.write(image, "jpg", outputStream);
        } catch (IOException e) {
            return new DataRespBean(ResultCodeMsg.SERVER_ERROR.getErrMsg(), e.getMessage());
        }finally {
            map.put("uuid", uuid);
            map.put("img", Base64Encoder.encode(outputStream.toByteArray()));
            os.close();
        }
        return new DataRespBean<>(map);
    }
}

验证码生成规则(根据实际需求修改)

public class KaptchaTextCreator extends DefaultTextCreator {
 
    private static final String[] NUMBER= "0,1,2,3,4,5,6,7,8,9,10".split(",");
 
    @Override
    public String getText() {
        Integer result = 0;//结果
        Random random = new Random();
        int x = random.nextInt(10);
        int y = random.nextInt(10);
        StringBuilder chinese = new StringBuilder();
        int randomop = (int) random.nextInt(4)
        //判断结果生成加减乘除
        switch (randomoperands){
            case 0 :
                result = x * y;
                chinese.append(NUMBER[x]);
                chinese.append("*");
                chinese.append(NUMBER[y]);
                break;
            case 1 :
                if (!x == 0 && y % x == 0) {
                    result = y / x;
                    chinese.append(NUMBER[y]);
                    chinese.append("/");
                    chinese.append(NUMBER[x]);
                } else {
                    result = x + y;
                    chinese.append(NUMBER[x]);
                    chinese.append("+");
                    chinese.append(NUMBER[y]);
                }
                break;
            case 2 :
                if (x >= y) {
                    result = x - y;
                    chinese.append(NUMBER[x]);
                    chinese.append("-");
                    chinese.append(NUMBER[y]);
                } else {
                    result = y - x;
                    chinese.append(NUMBER[y]);
                    chinese.append("-");
                    chinese.append(NUMBER[x]);
                }
                break;
            default:
                result = x + y;
                chinese.append(NUMBER[x]);
                chinese.append("+");
                chinese.append(NUMBER[y]);
        }
        //拼接结果返回
        suChinese.append("=?@" + result);
        return suChinese.toString();
    }

生成图片验证码配置


@Configuration
public class CaptchaConfig {
    @Bean(name = "captchaProducerMath")
    public DefaultKaptcha getKaptchaBeanMath() {
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        Properties properties = new Properties();
        // 图片边框
        properties.setProperty(KAPTCHA_BORDER, "yes");
        // 边框颜色
        properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90");
        // 文本颜色
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue");
        // 图片宽度 
        properties.setProperty(KAPTCHA_IMAGE_WIDTH, "130");
        // 图片高度 
        properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "32");
        // 文本字符大小
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "28");
        // KAPTCHA_SESSION_KEY
        properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "KAPTCHA_SESSION_KEY");
        // 验证码文本生成器
        properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "对应自己的KaptchaTextCreator 文件路径");
        // 文本字符间距 
        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3");
        // 文本字符长度
        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6");
        // 文本字体样式
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
        // 干扰颜色
        properties.setProperty(KAPTCHA_NOISE_COLOR, "white");
        // 干扰实现类
        properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise");
        // 图片样式
        properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
        Config config = new Config(properties);
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }
}

返回结果(jpg base64编码)

效果展示

标签:KAPTCHA,chinese,spring,boot,NUMBER,Kaptcha,setProperty,properties,append
From: https://www.cnblogs.com/Liguangyang/p/17055945.html

相关文章

  • yml文件配置了但是springboot读不到yml的内容的问题(已解决)
    在写项目时可能误操作加了这一句代码,结果就导致了系统读不到yml配置解决方法:删除pom.xml中的<packagin>pom</packagin>或者尝试 https://blog.csdn.net/qq_41555595/art......
  • Spring 源码分析
    1.Springbean的生命周期2.Spring启动流程详解3.Spring扫描底层流程详解4.SpringBeanPostProcessor架构5.SpringApplicationContext和BeanFactory架构图6.......
  • 【深入浅出Spring原理及实战】「源码调试分析」结合DataSourceRegister深入分析Import
    每日一句人的一生中不可能会一帆风顺,总会遇到一些挫折,当你对生活失去了信心的时候,仔细的看一看、好好回想一下你所遇到的最美好的事情吧,那会让你感觉到生活的美好。注入案例......
  • 【深入浅出Spring原理及实战】「源码调试分析」结合DataSourceRegister深入分析Import
    每日一句人的一生中不可能会一帆风顺,总会遇到一些挫折,当你对生活失去了信心的时候,仔细的看一看、好好回想一下你所遇到的最美好的事情吧,那会让你感觉到生活的美好。注......
  • SprintBoot2报错汇总
    报错1:找不到beanUnabletostartServletWebServerApplicationContextduetomissingServletWebServerFactorybean缺少注解 @SpringBootApplication  ......
  • Spring5
    1、Spring1.1、简介Spring:给软件行业带来了春天!2002,首次推出了Spring框架雏形:interface21框架!Spring框架以interface21框架为基础,经过重新设计,不断丰富内涵,于200......
  • springboot返回json和xml
    在项目中某些情况下接口需要返回的是xml数据或者json数据1、在springboot项目加入依赖jackson-dataformat-xml<dependency><groupId>com.fasterxml.jacks......
  • springboot的定时任务
    1、定时任务的创建方式:基于注解@Schedule和@EnableScheduling(待完善。。。)2、@Schedule和@EnableScheduling适用于定时任务执行时间较短,并且比较单......
  • SpringBoot集成Thymeleaf
    1、引入依赖在maven项目的pom.xml中引入spingboot-boot-starter-thymeleaf依赖,同时为了解决Html严格校验报错的问题,增加nekohtml依赖<!--thymeleaf模板引擎-->......
  • springboot集成nacos 注册中心
     接上一篇集成配置中心,本文介绍注册中心,目录结构如下在nacosregister的pom.xml文件中添加引用<dependency><groupId>com.alibaba.cloud</groupId>......