SpringBoot中注解@ConfigurationProperties的作用_@configurationproperties(prefix = "security.captch-程序员宅基地

技术标签: spring  spring boot  java  Spring Boot  开源框架  

作用

@ConfigurationProperties的作用:可以读取配置文件中的信息,并自动封装成实体类,该实体类的名称,默认是类名的首字母小写。

比如,在application.yml中有这样的内容:

# 安全配置
security:
  # 验证码
  captcha:
    enabled: true
    type: math

代码演示

package com.ruoyi.gateway.config.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;

/**
 * 验证码配置
 */
@Configuration
@RefreshScope
@ConfigurationProperties(prefix = "security.captcha")
public class CaptchaProperties{
    
    /**
     * 验证码开关
     */
    private Boolean enabled;
    /**
     * 验证码类型(math 数组计算 char 字符)
     */
    private String type;

    public Boolean getEnabled(){
    
        return enabled;
    }
    public void setEnabled(Boolean enabled){
    
        this.enabled = enabled;
    }
    public String getType(){
    
        return type;
    }
    public void setType(String type){
    
        this.type = type;
    }
}

@RefreshScope :开启自动刷新功能。

@ConfigurationProperties(prefix = “security.captcha”) :在配置文件中,找寻路径为security.captcha的配置信息,并读取其下的配置项,与类中的字段进行匹配。

CaptchaProperties如何使用

CaptchaConfig 验证码配置

package com.ruoyi.gateway.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;
import static com.google.code.kaptcha.Constants.*;

/**
 * 验证码配置
 */
@Configuration
public class CaptchaConfig
{
    
    @Bean(name = "captchaProducer")
    public DefaultKaptcha getKaptchaBean(){
    
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        Properties properties = new Properties();
        // 是否有边框 默认为true 我们可以自己设置yes,no
        properties.setProperty(KAPTCHA_BORDER, "yes");
        // 验证码文本字符颜色 默认为Color.BLACK
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");
        // 验证码图片宽度 默认为200
        properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
//         验证码图片高度 默认为50
        properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
//         验证码文本字符大小 默认为40
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38");
        // KAPTCHA_SESSION_KEY
        properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");
        // 验证码文本字符长度 默认为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");
        // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy
        properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
        Config config = new Config(properties);
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }
        
    @Bean(name = "captchaProducerMath")
    public DefaultKaptcha getKaptchaBeanMath(){
    
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        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, "160");
        // 验证码图片高度 默认为50
        properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
        // 验证码文本字符大小 默认为40
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35");
        // KAPTCHA_SESSION_KEY
        properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath");
        // 验证码文本生成器
        properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.ruoyi.gateway.config.KaptchaTextCreator");
        // 验证码文本字符间距 默认为2
        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3");
        // 验证码文本字符长度 默认为5
        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6");
        // 验证码文本字体样式 默认为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, "white");
        // 干扰实现类
        properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise");
        // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy
        properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
        Config config = new Config(properties);
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }
}

ValidateCodeServiceImpl 验证码实现处理

package com.ruoyi.gateway.service.impl;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.FastByteArrayOutputStream;
import com.google.code.kaptcha.Producer;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.exception.CaptchaException;
import com.ruoyi.common.core.utils.IdUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.sign.Base64;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.gateway.config.properties.CaptchaProperties;
import com.ruoyi.gateway.service.ValidateCodeService;

/**
 * 验证码实现处理
 */
@Service
public class ValidateCodeServiceImpl implements ValidateCodeService
{
    
    @Resource(name = "captchaProducer")
    private Producer captchaProducer;

    @Resource(name = "captchaProducerMath")
    private Producer captchaProducerMath;

    @Autowired
    private RedisService redisService;

    @Autowired
    private CaptchaProperties captchaProperties;

    /**
     * 生成验证码
     */
    @Override
    public AjaxResult createCapcha() throws IOException, CaptchaException
    {
    
        AjaxResult ajax = AjaxResult.success();
        boolean captchaOnOff = captchaProperties.getEnabled();
        ajax.put("captchaOnOff", captchaOnOff);
        if (!captchaOnOff)
        {
    
            return ajax;
        }

        // 保存验证码信息
        String uuid = IdUtils.simpleUUID();
        String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;

        String capStr = null, code = null;
        BufferedImage image = null;

        String captchaType = captchaProperties.getType();
        // 生成验证码
        if ("math".equals(captchaType))
        {
    
            String capText = captchaProducerMath.createText();
            capStr = capText.substring(0, capText.lastIndexOf("@"));
            code = capText.substring(capText.lastIndexOf("@") + 1);
            image = captchaProducerMath.createImage(capStr);
        }
        else if ("char".equals(captchaType))
        {
    
            capStr = code = captchaProducer.createText();
            image = captchaProducer.createImage(capStr);
        }

        redisService.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
        // 转换流信息写出
        FastByteArrayOutputStream os = new FastByteArrayOutputStream();
        try
        {
    
            ImageIO.write(image, "jpg", os);
        }
        catch (IOException e)
        {
    
            return AjaxResult.error(e.getMessage());
        }

        ajax.put("uuid", uuid);
        ajax.put("img", Base64.encode(os.toByteArray()));
        return ajax;
    }

    /**
     * 校验验证码
     */
    @Override
    public void checkCapcha(String code, String uuid) throws CaptchaException
    {
    
        if (StringUtils.isEmpty(code))
        {
    
            throw new CaptchaException("验证码不能为空");
        }
        if (StringUtils.isEmpty(uuid))
        {
    
            throw new CaptchaException("验证码已失效");
        }
        String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
        String captcha = redisService.getCacheObject(verifyKey);
        redisService.deleteObject(verifyKey);

        if (!code.equalsIgnoreCase(captcha))
        {
    
            throw new CaptchaException("验证码错误");
        }
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/single_0910/article/details/120645560

智能推荐

无效连接属性异常java.sql.SQLException: The server time zone value ‘�й���׼ʱ��‘ is unrecognized_具体错误信息为:java.sql.sqlexception: the server time zon-程序员宅基地

文章浏览阅读1.1w次,点赞19次,收藏19次。在学习Mybatis时,用IDEA配置出现一个异常,如下:java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver ..._具体错误信息为:java.sql.sqlexception: the server time zone value ' й

Springboot注解与分析之:@ComponentScan注解_@componentscan 和 context:component-scan base-packa-程序员宅基地

文章浏览阅读219次。Springboot注解与分析之:@ComponentScan注解)使用Spring框架开发Java Web项目的读者一定都用过@Controller、@Service、@Repository等注解。查看源码会发现,这些注解上都会标注一个共同的注解@Component。而在Spring IOC容器中@Controller、@Service、@Repository、@Component等注解的默认装配标识是@ComponentScan注解。<!-- 自动扫描 --><context:_@componentscan 和 context:component-scan base-package 优先级

机器学习实战第三章(决策树)_mydat,labels-程序员宅基地

文章浏览阅读968次。第二章介绍的k-近邻算法可以完成很多分类任务,但是最大缺点是无法给出数据的内在含义,决策树的主要优势就在于数据形式非常容易理解。决策树: 优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据 缺点:可能会产生过度匹配问题 树用数据类型:数值型和标称型。在构造决策树时,我们需要解决的第一个问题就是,当前数据集上哪个特征在划分数据分类时起决_mydat,labels

LR(0)分析表的构建_lr分析表-程序员宅基地

文章浏览阅读2.6w次,点赞58次,收藏300次。LR(0)分析表的构建_lr分析表

【毕业设计】基于单片机的火灾报警系统 -stm32 单片机物联网-程序员宅基地

文章浏览阅读4.4k次,点赞5次,收藏75次。Hi,大家好,这里是丹成学长,今天向大家介绍一个学长做的单片机项目大家可用于 课程设计 或 毕业设计单片机-嵌入式毕设选题大全及项目分享:https://blog.csdn.net/m0_71572576/article/details/1254090521、MCU采用stm32;2、使用MQ2传感器采集烟雾等有害气体,当检测到有害气体时发声报警,并可以邮件通知用户;3、使用DS18B20传感器检测环境温度和火焰;4、采用OLED12864显示屏进行数据显示;5、可设置传感器阈值,修改检测灵敏度;正常状态加_基于单片机的火灾报警系统

okhttp3 springboot post 接收与传参_java okhttp3接收请求体-程序员宅基地

文章浏览阅读4.3k次。springboot+android 收参 传参_java okhttp3接收请求体

随便推点

DIKW体系(Data-Information-Knowlege-Wisdom)_data information knowledge wisdom-程序员宅基地

文章浏览阅读7.7k次,点赞8次,收藏21次。这个世界上,失败的人除了天分太差之外,只有以下几点,懒,方向不对,方法不对,没有坚持。你是哪一种呢?关于DIKW体系 DIKW体系是关于数据、信息、知识及智慧的体系,可以追溯至托马斯·斯特尔那斯·艾略特所写的诗《岩石》。在首段,他写道:“我们在哪里丢失了知识中的智慧?又在哪里丢失了信息中的知识?”(Where is the wisdom we have lost ..._data information knowledge wisdom

鸿蒙HarmonyOS开发实战—AI功能开发(分词)_如何调用鸿蒙系统的ai接口-程序员宅基地

文章浏览阅读605次,点赞15次,收藏13次。等)以及一份在Github上持续爆火霸榜的《纯血版华为鸿蒙 (Harmony OS)开发手册》(共计890页),希望对大家有所帮助。String requestData = “{“text”:“今天天气不错,我们一起看电影吧\n”,“type”:0}”;最后,为了能让大家更好的去学习提升鸿蒙 (Harmony OS) 开发技术,小编连夜整理了一份30个G。,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。// 初始化成功回调,在服务初始化成功调用该函数。

【ES6学习笔记】-----箭头函数与symbol_箭头函数 symbol-程序员宅基地

文章浏览阅读523次。【ES6学习笔记】—–箭头函数与symbol一.箭头函数 我们在ES6以前写函数使用function这个关键字。 但是字ES6中出现了 =>, 有点像lambda表达式的感觉。这是ES6编写函数的新语法。 它使我们的代码变得更加简洁。比如我们在ES5可能会写如下代码var overArr = mobileArr.map(function(dir){ return dir.ifselect_箭头函数 symbol

sqlmap使用详解_sqlmap python2-程序员宅基地

文章浏览阅读284次。一、sqlmap基本使用1、判断是否存在注入(1) 当检测参数为一个的时候:python2 sqlmap.py -u http://localhost/sqli-master/Less-1/?id=1(2)当参数大于等于两个时,需要加双引号:python2 sqlmap.py -u "http://localhost/sqli-master/Less-1/?id=1&uid=3"(3)当测试的位置是cookie或者post传值等位置时,需将获得流量包保存在txt文件中进行测试:python_sqlmap python2

Ext2.0教程下载_ppt版-程序员宅基地

文章浏览阅读114次。 下载地址:http://download.csdn.net/source/594644 自己写的公司培训ppt教程。里面有三个完整的例子源码,可以直接打开运行,附加详细注释。详细介绍见: Ext2.X教程一:Ext介绍以及 ext页面布局 链接:http://blog.csdn.net/wayfoon322/archive/2008/08/27/2836057.aspx Ex..._ext2.0中文下载

[GN] 配置armcc工具链_armcc v5 toolchain-程序员宅基地

文章浏览阅读2.5k次。对于gn来说,工具链被抽象为一系列的工具描述,我们要做的就是写对应的工具描述文件出来。首先在工程根目录建立一个文件.gn(注意文件的名字为空,后缀为.gn),文件中配置工具链描述文件所在的路径buildconfig = "//build/buildconfig.gn"该变量定义了构建工具链描述文件所在的路径,//表示工程根目录。在buildconfig.gn中定义工具链。s..._armcc v5 toolchain

推荐文章

热门文章

相关标签