疯狂的狮子li
2021-05-17 2ebcffb22ef17421b322e58a0f2b96388a4d83cd
update 配置统一提取为 properties 配置类
已修改7个文件
已添加5个文件
已重命名1个文件
453 ■■■■■ 文件已修改
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application.yml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/CaptchaProperties.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/ThreadPoolProperties.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/TokenProperties.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/XssProperties.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java
@@ -13,8 +13,8 @@
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.framework.config.properties.CaptchaProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -42,18 +42,8 @@
    @Autowired
    private RedisCache redisCache;
    // éªŒè¯ç ç±»åž‹
    @Value("${captcha.captchaType}")
    private String captchaType;
    // éªŒè¯ç ç±»åˆ«
    @Value("${captcha.captchaCategory}")
    private String captchaCategory;
    // æ•°å­—验证码位数
    @Value("${captcha.captchaNumberLength}")
    private int numberLength;
    // å­—符验证码长度
    @Value("${captcha.captchaCharLength}")
    private int charLength;
    @Autowired
    private CaptchaProperties captchaProperties;
    /**
     * ç”ŸæˆéªŒè¯ç 
@@ -67,17 +57,17 @@
        // ç”ŸæˆéªŒè¯ç 
        CodeGenerator codeGenerator;
        AbstractCaptcha captcha;
        switch (captchaType) {
        switch (captchaProperties.getType()) {
            case "math":
                codeGenerator = new MathGenerator(numberLength);
                codeGenerator = new MathGenerator(captchaProperties.getNumberLength());
                break;
            case "char":
                codeGenerator = new RandomGenerator(charLength);
                codeGenerator = new RandomGenerator(captchaProperties.getCharLength());
                break;
            default:
                throw new IllegalArgumentException("验证码类型异常");
        }
        switch (captchaCategory) {
        switch (captchaProperties.getCategory()) {
            case "line":
                captcha = lineCaptcha;
                break;
@@ -92,9 +82,9 @@
        }
        captcha.setGenerator(codeGenerator);
        captcha.createCode();
        if ("math".equals(captchaType)) {
        if ("math".equals(captchaProperties.getType())) {
            code = getCodeResult(captcha.getCode());
        } else if ("char".equals(captchaType)) {
        } else if ("char".equals(captchaProperties.getType())) {
            code = captcha.getCode();
        }
        redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
@@ -105,6 +95,7 @@
    }
    private String getCodeResult(String capStr) {
        int numberLength = captchaProperties.getNumberLength();
        int a = Convert.toInt(StrUtil.sub(capStr, 0, numberLength).trim());
        char operator = capStr.charAt(numberLength);
        int b = Convert.toInt(StrUtil.sub(capStr, numberLength + 1, numberLength + 1 + numberLength).trim());
ruoyi-admin/src/main/resources/application.yml
@@ -15,13 +15,13 @@
captcha:
  # éªŒè¯ç ç±»åž‹ math æ•°ç»„计算 char å­—符验证
  captchaType: math
  type: math
  # line çº¿æ®µå¹²æ‰° circle åœ†åœˆå¹²æ‰° shear æ‰­æ›²å¹²æ‰°
  captchaCategory: circle
  category: circle
  # æ•°å­—验证码位数
  captchaNumberLength: 1
  numberLength: 1
  # å­—符验证码长度
  captchaCharLength: 4
  charLength: 4
# å¼€å‘环境配置
server:
@@ -187,8 +187,6 @@
swagger:
  # æ˜¯å¦å¼€å¯swagger
  enabled: true
  # è¯·æ±‚前缀
  pathMapping: /dev-api
  # æ ‡é¢˜
  title: '标题:RuoYi-Vue-Plus后台管理系统_接口文档'
  # æè¿°
@@ -206,7 +204,7 @@
  urlPatterns: /system/*,/monitor/*,/tool/*
# å…¨å±€çº¿ç¨‹æ± ç›¸å…³é…ç½®
threadPoolConfig:
thread-pool:
  # æ˜¯å¦å¼€å¯çº¿ç¨‹æ± 
  enabled: false
  # æ ¸å¿ƒçº¿ç¨‹æ± å¤§å°
ruoyi-common/pom.xml
@@ -145,6 +145,11 @@
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--  è‡ªåŠ¨ç”ŸæˆYML配置关联JSON文件  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
        </dependency>
    </dependencies>
ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java
@@ -3,7 +3,8 @@
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.filter.RepeatableFilter;
import com.ruoyi.common.filter.XssFilter;
import org.springframework.beans.factory.annotation.Value;
import com.ruoyi.framework.config.properties.XssProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -15,41 +16,33 @@
/**
 * Filter配置
 *
 * @author ruoyi
 * @author Lion Li
 */
@Configuration
public class FilterConfig
{
    @Value("${xss.enabled}")
    private String enabled;
public class FilterConfig {
    @Value("${xss.excludes}")
    private String excludes;
    @Autowired
    private XssProperties xssProperties;
    @Value("${xss.urlPatterns}")
    private String urlPatterns;
    @SuppressWarnings({ "rawtypes", "unchecked" })
    @SuppressWarnings({"rawtypes", "unchecked"})
    @Bean
    public FilterRegistrationBean xssFilterRegistration()
    {
    public FilterRegistrationBean xssFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setDispatcherTypes(DispatcherType.REQUEST);
        registration.setFilter(new XssFilter());
        registration.addUrlPatterns(StrUtil.split(urlPatterns, ","));
        registration.addUrlPatterns(StrUtil.split(xssProperties.getUrlPatterns(), ","));
        registration.setName("xssFilter");
        registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE);
        Map<String, String> initParameters = new HashMap<String, String>();
        initParameters.put("excludes", excludes);
        initParameters.put("enabled", enabled);
        initParameters.put("excludes", xssProperties.getExcludes());
        initParameters.put("enabled", xssProperties.getEnabled());
        registration.setInitParameters(initParameters);
        return registration;
    }
    @SuppressWarnings({ "rawtypes", "unchecked" })
    @SuppressWarnings({"rawtypes", "unchecked"})
    @Bean
    public FilterRegistrationBean someFilterRegistration()
    {
    public FilterRegistrationBean someFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new RepeatableFilter());
        registration.addUrlPatterns("/*");
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java
ÎļþÃû´Ó ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.ruoyi.web.core.config;
package com.ruoyi.framework.config;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import com.ruoyi.common.config.RuoYiConfig;
@@ -37,12 +37,6 @@
     */
    @Autowired
    private RuoYiConfig ruoyiConfig;
    /**
     * è®¾ç½®è¯·æ±‚的统一前缀
     */
    @Value("${swagger.pathMapping}")
    private String pathMapping;
    /**
     * æ ‡é¢˜
ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java
@@ -1,8 +1,9 @@
package com.ruoyi.framework.config;
import com.ruoyi.common.utils.Threads;
import com.ruoyi.framework.config.properties.ThreadPoolProperties;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -21,43 +22,31 @@
@Configuration
public class ThreadPoolConfig {
    // æ ¸å¿ƒçº¿ç¨‹æ± å¤§å°
    @Value("${threadPoolConfig.corePoolSize}")
    private int corePoolSize;
    // æœ€å¤§å¯åˆ›å»ºçš„线程数
    @Value("${threadPoolConfig.maxPoolSize}")
    private int maxPoolSize;
    // é˜Ÿåˆ—最大长度
    @Value("${threadPoolConfig.queueCapacity}")
    private int queueCapacity;
    // çº¿ç¨‹æ± ç»´æŠ¤çº¿ç¨‹æ‰€å…è®¸çš„空闲时间
    @Value("${threadPoolConfig.keepAliveSeconds}")
    private int keepAliveSeconds;
    // çº¿ç¨‹æ± å¯¹æ‹’绝任务(无线程可用)的处理策略
    @Value("${threadPoolConfig.rejectedExecutionHandler}")
    private String rejectedExecutionHandler;
    @Autowired
    private ThreadPoolProperties threadPoolProperties;
    @Bean(name = "threadPoolTaskExecutor")
    @ConditionalOnProperty(prefix = "threadPoolTaskExecutor", name = "enabled", havingValue = "true")
    public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(maxPoolSize);
        executor.setCorePoolSize(corePoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.setKeepAliveSeconds(keepAliveSeconds);
        executor.setMaxPoolSize(threadPoolProperties.getMaxPoolSize());
        executor.setCorePoolSize(threadPoolProperties.getCorePoolSize());
        executor.setQueueCapacity(threadPoolProperties.getQueueCapacity());
        executor.setKeepAliveSeconds(threadPoolProperties.getKeepAliveSeconds());
        RejectedExecutionHandler handler;
        if (rejectedExecutionHandler.equals("CallerRunsPolicy")) {
            handler = new ThreadPoolExecutor.CallerRunsPolicy();
        } else if (rejectedExecutionHandler.equals("DiscardOldestPolicy")) {
            handler = new ThreadPoolExecutor.DiscardOldestPolicy();
        } else if (rejectedExecutionHandler.equals("DiscardPolicy")) {
            handler = new ThreadPoolExecutor.DiscardPolicy();
        } else {
            handler = new ThreadPoolExecutor.AbortPolicy();
        switch (threadPoolProperties.getRejectedExecutionHandler()) {
            case "CallerRunsPolicy":
                handler = new ThreadPoolExecutor.CallerRunsPolicy();
                break;
            case "DiscardOldestPolicy":
                handler = new ThreadPoolExecutor.DiscardOldestPolicy();
                break;
            case "DiscardPolicy":
                handler = new ThreadPoolExecutor.DiscardPolicy();
                break;
            default:
                handler = new ThreadPoolExecutor.AbortPolicy();
                break;
        }
        executor.setRejectedExecutionHandler(handler);
        return executor;
@@ -68,7 +57,7 @@
     */
    @Bean(name = "scheduledExecutorService")
    protected ScheduledExecutorService scheduledExecutorService() {
        return new ScheduledThreadPoolExecutor(corePoolSize,
        return new ScheduledThreadPoolExecutor(threadPoolProperties.getCorePoolSize(),
                new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build()) {
            @Override
            protected void afterExecute(Runnable r, Throwable t) {
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/CaptchaProperties.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.framework.config.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
 * éªŒè¯ç  é…ç½®å±žæ€§
 *
 * @author Lion Li
 */
@Data
@Component
@ConfigurationProperties(prefix = "captcha")
public class CaptchaProperties {
    // éªŒè¯ç ç±»åž‹
    private String type;
    // éªŒè¯ç ç±»åˆ«
    private String category;
    // æ•°å­—验证码位数
    private Integer numberLength;
    // å­—符验证码长度
    private Integer charLength;
}
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java
@@ -1,76 +1,54 @@
package com.ruoyi.framework.config.properties;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
 * druid é…ç½®å±žæ€§
 *
 * @author ruoyi
 *
 * @author Lion Li
 */
@Data
@Configuration
public class DruidProperties
{
    @Value("${spring.datasource.druid.initialSize}")
@ConfigurationProperties(prefix = "spring.datasource.druid")
public class DruidProperties {
    /** åˆå§‹è¿žæŽ¥æ•° */
    private int initialSize;
    @Value("${spring.datasource.druid.minIdle}")
    /** æœ€å°è¿žæŽ¥æ± æ•°é‡ */
    private int minIdle;
    @Value("${spring.datasource.druid.maxActive}")
    /** æœ€å¤§è¿žæŽ¥æ± æ•°é‡ */
    private int maxActive;
    @Value("${spring.datasource.druid.maxWait}")
    /** é…ç½®èŽ·å–è¿žæŽ¥ç­‰å¾…è¶…æ—¶çš„æ—¶é—´ */
    private int maxWait;
    @Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}")
    /** é…ç½®é—´éš”多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */
    private int timeBetweenEvictionRunsMillis;
    @Value("${spring.datasource.druid.minEvictableIdleTimeMillis}")
    /** é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å°ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒 */
    private int minEvictableIdleTimeMillis;
    @Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}")
    /** é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å¤§ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒 */
    private int maxEvictableIdleTimeMillis;
    @Value("${spring.datasource.druid.validationQuery}")
    /** é…ç½®æ£€æµ‹è¿žæŽ¥æ˜¯å¦æœ‰æ•ˆ */
    private String validationQuery;
    @Value("${spring.datasource.druid.testWhileIdle}")
    /** åˆå§‹è¿žæŽ¥æ•° */
    private boolean testWhileIdle;
    @Value("${spring.datasource.druid.testOnBorrow}")
    /** åˆå§‹è¿žæŽ¥æ•° */
    private boolean testOnBorrow;
    @Value("${spring.datasource.druid.testOnReturn}")
    /** åˆå§‹è¿žæŽ¥æ•° */
    private boolean testOnReturn;
    public DruidDataSource dataSource(DruidDataSource datasource)
    {
        /** é…ç½®åˆå§‹åŒ–大小、最小、最大 */
    public DruidDataSource dataSource(DruidDataSource datasource) {
        datasource.setInitialSize(initialSize);
        datasource.setMaxActive(maxActive);
        datasource.setMinIdle(minIdle);
        /** é…ç½®èŽ·å–è¿žæŽ¥ç­‰å¾…è¶…æ—¶çš„æ—¶é—´ */
        datasource.setMaxWait(maxWait);
        /** é…ç½®é—´éš”多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */
        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        /** é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å°ã€æœ€å¤§ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒 */
        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis);
        /**
         * ç”¨æ¥æ£€æµ‹è¿žæŽ¥æ˜¯å¦æœ‰æ•ˆçš„sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
         */
        datasource.setValidationQuery(validationQuery);
        /** å»ºè®®é…ç½®ä¸ºtrue,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 */
        datasource.setTestWhileIdle(testWhileIdle);
        /** ç”³è¯·è¿žæŽ¥æ—¶æ‰§è¡ŒvalidationQuery检测连接是否有效,做了这个配置会降低性能。 */
        datasource.setTestOnBorrow(testOnBorrow);
        /** å½’还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */
        datasource.setTestOnReturn(testOnReturn);
        return datasource;
    }
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.ruoyi.framework.config.properties;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
 * éªŒè¯ç  é…ç½®å±žæ€§
 *
 * @author Lion Li
 */
@Data
@Component
@ConfigurationProperties(prefix = "swagger")
public class SwaggerProperties {
    /**
     * éªŒè¯ç ç±»åž‹
     */
    private Boolean enabled;
    /**
     * éªŒè¯ç ç±»åˆ«
     */
    private String title;
    /**
     * æ•°å­—验证码位数
     */
    private String description;
    /**
     * å­—符验证码长度
     */
    private String version;
}
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/ThreadPoolProperties.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
package com.ruoyi.framework.config.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
 * éªŒè¯ç  é…ç½®å±žæ€§
 *
 * @author Lion Li
 */
@Data
@Component
@ConfigurationProperties(prefix = "thread-pool")
public class ThreadPoolProperties {
    /**
     * æ˜¯å¦å¼€å¯çº¿ç¨‹æ± 
     */
    private boolean enabled;
    /**
     * æ ¸å¿ƒçº¿ç¨‹æ± å¤§å°
     */
    private int corePoolSize;
    /**
     * æœ€å¤§å¯åˆ›å»ºçš„线程数
     */
    private int maxPoolSize;
    /**
     * é˜Ÿåˆ—最大长度
     */
    private int queueCapacity;
    /**
     * çº¿ç¨‹æ± ç»´æŠ¤çº¿ç¨‹æ‰€å…è®¸çš„空闲时间
     */
    private int keepAliveSeconds;
    /**
     * çº¿ç¨‹æ± å¯¹æ‹’绝任务(无线程可用)的处理策略
     */
    private String rejectedExecutionHandler;
}
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/TokenProperties.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.framework.config.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "token")
public class TokenProperties {
    /**
     * ä»¤ç‰Œè‡ªå®šä¹‰æ ‡è¯†
     */
    private String header;
    /**
     * ä»¤ç‰Œç§˜é’¥
     */
    private String secret;
    /**
     * ä»¤ç‰Œæœ‰æ•ˆæœŸï¼ˆé»˜è®¤30分钟)
     */
    private int expireTime;
}
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/XssProperties.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.framework.config.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
 * éªŒè¯ç  é…ç½®å±žæ€§
 *
 * @author Lion Li
 */
@Data
@Component
@ConfigurationProperties(prefix = "xss")
public class XssProperties {
    /**
     * è¿‡æ»¤å¼€å…³
     */
    private String enabled;
    /**
     * æŽ’除链接(多个用逗号分隔)
     */
    private String excludes;
    /**
     * åŒ¹é…é“¾æŽ¥
     */
    private String urlPatterns;
}
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
@@ -10,11 +10,11 @@
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.ip.AddressUtils;
import com.ruoyi.common.utils.ip.IpUtils;
import com.ruoyi.framework.config.properties.TokenProperties;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
@@ -25,22 +25,10 @@
/**
 * token验证处理
 *
 * @author ruoyi
 * @author Lion Li
 */
@Component
public class TokenService
{
    // ä»¤ç‰Œè‡ªå®šä¹‰æ ‡è¯†
    @Value("${token.header}")
    private String header;
    // ä»¤ç‰Œç§˜é’¥
    @Value("${token.secret}")
    private String secret;
    // ä»¤ç‰Œæœ‰æ•ˆæœŸï¼ˆé»˜è®¤30分钟)
    @Value("${token.expireTime}")
    private int expireTime;
public class TokenService {
    protected static final long MILLIS_SECOND = 1000;
@@ -51,17 +39,18 @@
    @Autowired
    private RedisCache redisCache;
    @Autowired
    private TokenProperties tokenProperties;
    /**
     * èŽ·å–ç”¨æˆ·èº«ä»½ä¿¡æ¯
     *
     * @return ç”¨æˆ·ä¿¡æ¯
     */
    public LoginUser getLoginUser(HttpServletRequest request)
    {
    public LoginUser getLoginUser(HttpServletRequest request) {
        // èŽ·å–è¯·æ±‚æºå¸¦çš„ä»¤ç‰Œ
        String token = getToken(request);
        if (Validator.isNotEmpty(token))
        {
        if (Validator.isNotEmpty(token)) {
            Claims claims = parseToken(token);
            // è§£æžå¯¹åº”的权限以及用户信息
            String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
@@ -75,10 +64,8 @@
    /**
     * è®¾ç½®ç”¨æˆ·èº«ä»½ä¿¡æ¯
     */
    public void setLoginUser(LoginUser loginUser)
    {
        if (Validator.isNotNull(loginUser) && Validator.isNotEmpty(loginUser.getToken()))
        {
    public void setLoginUser(LoginUser loginUser) {
        if (Validator.isNotNull(loginUser) && Validator.isNotEmpty(loginUser.getToken())) {
            refreshToken(loginUser);
        }
    }
@@ -86,10 +73,8 @@
    /**
     * åˆ é™¤ç”¨æˆ·èº«ä»½ä¿¡æ¯
     */
    public void delLoginUser(String token)
    {
        if (Validator.isNotEmpty(token))
        {
    public void delLoginUser(String token) {
        if (Validator.isNotEmpty(token)) {
            String userKey = getTokenKey(token);
            redisCache.deleteObject(userKey);
        }
@@ -101,8 +86,7 @@
     * @param loginUser ç”¨æˆ·ä¿¡æ¯
     * @return ä»¤ç‰Œ
     */
    public String createToken(LoginUser loginUser)
    {
    public String createToken(LoginUser loginUser) {
        String token = IdUtil.fastUUID();
        loginUser.setToken(token);
        setUserAgent(loginUser);
@@ -119,12 +103,10 @@
     * @param loginUser
     * @return ä»¤ç‰Œ
     */
    public void verifyToken(LoginUser loginUser)
    {
    public void verifyToken(LoginUser loginUser) {
        long expireTime = loginUser.getExpireTime();
        long currentTime = System.currentTimeMillis();
        if (expireTime - currentTime <= MILLIS_MINUTE_TEN)
        {
        if (expireTime - currentTime <= MILLIS_MINUTE_TEN) {
            refreshToken(loginUser);
        }
    }
@@ -134,13 +116,12 @@
     *
     * @param loginUser ç™»å½•信息
     */
    public void refreshToken(LoginUser loginUser)
    {
    public void refreshToken(LoginUser loginUser) {
        loginUser.setLoginTime(System.currentTimeMillis());
        loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
        loginUser.setExpireTime(loginUser.getLoginTime() + tokenProperties.getExpireTime() * MILLIS_MINUTE);
        // æ ¹æ®uuid将loginUser缓存
        String userKey = getTokenKey(loginUser.getToken());
        redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
        redisCache.setCacheObject(userKey, loginUser, tokenProperties.getExpireTime(), TimeUnit.MINUTES);
    }
    /**
@@ -148,8 +129,7 @@
     *
     * @param loginUser ç™»å½•信息
     */
    public void setUserAgent(LoginUser loginUser)
    {
    public void setUserAgent(LoginUser loginUser) {
        UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent"));
        String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
        loginUser.setIpaddr(ip);
@@ -164,11 +144,10 @@
     * @param claims æ•°æ®å£°æ˜Ž
     * @return ä»¤ç‰Œ
     */
    private String createToken(Map<String, Object> claims)
    {
    private String createToken(Map<String, Object> claims) {
        String token = Jwts.builder()
                .setClaims(claims)
                .signWith(SignatureAlgorithm.HS512, secret).compact();
                .signWith(SignatureAlgorithm.HS512, tokenProperties.getSecret()).compact();
        return token;
    }
@@ -178,10 +157,9 @@
     * @param token ä»¤ç‰Œ
     * @return æ•°æ®å£°æ˜Ž
     */
    private Claims parseToken(String token)
    {
    private Claims parseToken(String token) {
        return Jwts.parser()
                .setSigningKey(secret)
                .setSigningKey(tokenProperties.getSecret())
                .parseClaimsJws(token)
                .getBody();
    }
@@ -192,8 +170,7 @@
     * @param token ä»¤ç‰Œ
     * @return ç”¨æˆ·å
     */
    public String getUsernameFromToken(String token)
    {
    public String getUsernameFromToken(String token) {
        Claims claims = parseToken(token);
        return claims.getSubject();
    }
@@ -204,18 +181,15 @@
     * @param request
     * @return token
     */
    private String getToken(HttpServletRequest request)
    {
        String token = request.getHeader(header);
        if (Validator.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX))
        {
    private String getToken(HttpServletRequest request) {
        String token = request.getHeader(tokenProperties.getHeader());
        if (Validator.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) {
            token = token.replace(Constants.TOKEN_PREFIX, "");
        }
        return token;
    }
    private String getTokenKey(String uuid)
    {
    private String getTokenKey(String uuid) {
        return Constants.LOGIN_TOKEN_KEY + uuid;
    }
}