32 changed files with 444 additions and 237 deletions
-
13tp-admin/src/main/java/com/inscloudtech/web/controller/system/SysProfileController.java
-
2tp-admin/src/main/resources/application.yml
-
29tp-common/src/main/java/com/inscloudtech/common/core/domain/dto/SysUserPasswordBo.java
-
2tp-common/src/main/java/com/inscloudtech/common/encrypt/annotation/ApiEncrypt.java
-
7tp-common/src/main/java/com/inscloudtech/common/encrypt/annotation/EncryptField.java
-
8tp-common/src/main/java/com/inscloudtech/common/encrypt/config/ApiDecryptAutoConfiguration.java
-
49tp-common/src/main/java/com/inscloudtech/common/encrypt/config/EncryptorAutoConfiguration.java
-
6tp-common/src/main/java/com/inscloudtech/common/encrypt/core/EncryptContext.java
-
158tp-common/src/main/java/com/inscloudtech/common/encrypt/core/EncryptorManager.java
-
6tp-common/src/main/java/com/inscloudtech/common/encrypt/core/IEncryptor.java
-
6tp-common/src/main/java/com/inscloudtech/common/encrypt/core/encryptor/AbstractEncryptor.java
-
10tp-common/src/main/java/com/inscloudtech/common/encrypt/core/encryptor/AesEncryptor.java
-
11tp-common/src/main/java/com/inscloudtech/common/encrypt/core/encryptor/Base64Encryptor.java
-
10tp-common/src/main/java/com/inscloudtech/common/encrypt/core/encryptor/RsaEncryptor.java
-
11tp-common/src/main/java/com/inscloudtech/common/encrypt/core/encryptor/Sm2Encryptor.java
-
10tp-common/src/main/java/com/inscloudtech/common/encrypt/core/encryptor/Sm4Encryptor.java
-
7tp-common/src/main/java/com/inscloudtech/common/encrypt/enumd/AlgorithmType.java
-
2tp-common/src/main/java/com/inscloudtech/common/encrypt/enumd/EncodeType.java
-
16tp-common/src/main/java/com/inscloudtech/common/encrypt/filter/CryptoFilter.java
-
4tp-common/src/main/java/com/inscloudtech/common/encrypt/filter/DecryptRequestBodyWrapper.java
-
9tp-common/src/main/java/com/inscloudtech/common/encrypt/filter/EncryptResponseBodyWrapper.java
-
30tp-common/src/main/java/com/inscloudtech/common/encrypt/interceptor/MybatisDecryptInterceptor.java
-
32tp-common/src/main/java/com/inscloudtech/common/encrypt/interceptor/MybatisEncryptInterceptor.java
-
4tp-common/src/main/java/com/inscloudtech/common/encrypt/properties/ApiDecryptProperties.java
-
8tp-common/src/main/java/com/inscloudtech/common/encrypt/properties/EncryptorProperties.java
-
2tp-common/src/main/java/com/inscloudtech/common/encrypt/utils/EncryptUtils.java
-
1tp-common/src/main/java/com/inscloudtech/common/filter/RepeatedlyRequestWrapper.java
-
3tp-common/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
-
39tp-framework/src/main/java/com/inscloudtech/framework/config/EncryptorConfig.java
-
18tp-framework/src/main/java/com/inscloudtech/framework/handler/AllUrlHandler.java
-
96tp-framework/src/main/java/com/inscloudtech/framework/manager/EncryptorManager.java
-
72tp-functional/src/test/java/JvmMemoryTest.java
@ -0,0 +1,29 @@ |
|||
package com.inscloudtech.common.core.domain.dto; |
|||
|
|||
import lombok.Data; |
|||
|
|||
|
|||
import javax.validation.constraints.NotBlank; |
|||
import java.io.Serializable; |
|||
|
|||
/** |
|||
* 用户密码修改bo |
|||
*/ |
|||
@Data |
|||
public class SysUserPasswordBo implements Serializable { |
|||
|
|||
|
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
/** |
|||
* 旧密码 |
|||
*/ |
|||
@NotBlank(message = "旧密码不能为空") |
|||
private String oldPassword; |
|||
|
|||
/** |
|||
* 新密码 |
|||
*/ |
|||
@NotBlank(message = "新密码不能为空") |
|||
private String newPassword; |
|||
} |
@ -1,4 +1,4 @@ |
|||
package com.inscloudtech.framework.encrypt; |
|||
package com.inscloudtech.common.encrypt.annotation; |
|||
|
|||
import java.lang.annotation.*; |
|||
|
@ -1,7 +1,8 @@ |
|||
package com.inscloudtech.common.annotation; |
|||
package com.inscloudtech.common.encrypt.annotation; |
|||
|
|||
import com.inscloudtech.common.enums.AlgorithmType; |
|||
import com.inscloudtech.common.enums.EncodeType; |
|||
|
|||
import com.inscloudtech.common.encrypt.enumd.AlgorithmType; |
|||
import com.inscloudtech.common.encrypt.enumd.EncodeType; |
|||
|
|||
import java.lang.annotation.*; |
|||
|
@ -0,0 +1,49 @@ |
|||
package com.inscloudtech.common.encrypt.config; |
|||
|
|||
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; |
|||
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties; |
|||
import com.inscloudtech.common.encrypt.core.EncryptorManager; |
|||
import com.inscloudtech.common.encrypt.interceptor.MybatisDecryptInterceptor; |
|||
import com.inscloudtech.common.encrypt.interceptor.MybatisEncryptInterceptor; |
|||
import com.inscloudtech.common.encrypt.properties.EncryptorProperties; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.boot.autoconfigure.AutoConfiguration; |
|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
|||
import org.springframework.boot.context.properties.EnableConfigurationProperties; |
|||
import org.springframework.context.annotation.Bean; |
|||
|
|||
/** |
|||
* 加解密配置 |
|||
* |
|||
* @author 老马 |
|||
* @version 4.6.0 |
|||
*/ |
|||
@AutoConfiguration(after = MybatisPlusAutoConfiguration.class) |
|||
@EnableConfigurationProperties(EncryptorProperties.class) |
|||
@ConditionalOnProperty(value = "mybatis-encryptor.enable", havingValue = "true") |
|||
@Slf4j |
|||
public class EncryptorAutoConfiguration { |
|||
|
|||
@Autowired |
|||
private EncryptorProperties properties; |
|||
|
|||
@Bean |
|||
public EncryptorManager encryptorManager(MybatisPlusProperties mybatisPlusProperties) { |
|||
return new EncryptorManager(mybatisPlusProperties.getTypeAliasesPackage()); |
|||
} |
|||
|
|||
@Bean |
|||
public MybatisEncryptInterceptor mybatisEncryptInterceptor(EncryptorManager encryptorManager) { |
|||
return new MybatisEncryptInterceptor(encryptorManager, properties); |
|||
} |
|||
|
|||
@Bean |
|||
public MybatisDecryptInterceptor mybatisDecryptInterceptor(EncryptorManager encryptorManager) { |
|||
return new MybatisDecryptInterceptor(encryptorManager, properties); |
|||
} |
|||
|
|||
} |
|||
|
|||
|
|||
|
@ -1,7 +1,7 @@ |
|||
package com.inscloudtech.common.encrypt; |
|||
package com.inscloudtech.common.encrypt.core; |
|||
|
|||
import com.inscloudtech.common.enums.AlgorithmType; |
|||
import com.inscloudtech.common.enums.EncodeType; |
|||
import com.inscloudtech.common.encrypt.enumd.AlgorithmType; |
|||
import com.inscloudtech.common.encrypt.enumd.EncodeType; |
|||
import lombok.Data; |
|||
|
|||
/** |
@ -0,0 +1,158 @@ |
|||
package com.inscloudtech.common.encrypt.core; |
|||
|
|||
import cn.hutool.core.collection.CollUtil; |
|||
import cn.hutool.core.util.ObjectUtil; |
|||
import cn.hutool.core.util.ReflectUtil; |
|||
import com.inscloudtech.common.encrypt.annotation.EncryptField; |
|||
import com.inscloudtech.common.utils.StringUtils; |
|||
import lombok.NoArgsConstructor; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.apache.ibatis.io.Resources; |
|||
import org.springframework.context.ConfigurableApplicationContext; |
|||
import org.springframework.core.io.Resource; |
|||
import org.springframework.core.io.support.PathMatchingResourcePatternResolver; |
|||
import org.springframework.core.io.support.ResourcePatternResolver; |
|||
import org.springframework.core.type.ClassMetadata; |
|||
import org.springframework.core.type.classreading.CachingMetadataReaderFactory; |
|||
import org.springframework.util.ClassUtils; |
|||
|
|||
import java.lang.reflect.Field; |
|||
import java.util.*; |
|||
import java.util.concurrent.ConcurrentHashMap; |
|||
import java.util.stream.Collectors; |
|||
|
|||
/** |
|||
* 加密管理类 |
|||
* |
|||
* @author 老马 |
|||
* @version 4.6.0 |
|||
*/ |
|||
@Slf4j |
|||
@NoArgsConstructor |
|||
public class EncryptorManager { |
|||
|
|||
/** |
|||
* 缓存加密器 |
|||
*/ |
|||
Map<EncryptContext, IEncryptor> encryptorMap = new ConcurrentHashMap<>(); |
|||
|
|||
/** |
|||
* 类加密字段缓存 |
|||
*/ |
|||
Map<Class<?>, Set<Field>> fieldCache = new ConcurrentHashMap<>(); |
|||
|
|||
/** |
|||
* 构造方法传入类加密字段缓存 |
|||
* |
|||
* @param typeAliasesPackage 实体类包 |
|||
*/ |
|||
public EncryptorManager(String typeAliasesPackage) { |
|||
scanEncryptClasses(typeAliasesPackage); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 获取类加密字段缓存 |
|||
*/ |
|||
public Set<Field> getFieldCache(Class<?> sourceClazz) { |
|||
if (ObjectUtil.isNotNull(fieldCache)) { |
|||
return fieldCache.get(sourceClazz); |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
/** |
|||
* 注册加密执行者到缓存 |
|||
* |
|||
* @param encryptContext 加密执行者需要的相关配置参数 |
|||
*/ |
|||
public IEncryptor registAndGetEncryptor(EncryptContext encryptContext) { |
|||
if (encryptorMap.containsKey(encryptContext)) { |
|||
return encryptorMap.get(encryptContext); |
|||
} |
|||
IEncryptor encryptor = ReflectUtil.newInstance(encryptContext.getAlgorithm().getClazz(), encryptContext); |
|||
encryptorMap.put(encryptContext, encryptor); |
|||
return encryptor; |
|||
} |
|||
|
|||
/** |
|||
* 移除缓存中的加密执行者 |
|||
* |
|||
* @param encryptContext 加密执行者需要的相关配置参数 |
|||
*/ |
|||
public void removeEncryptor(EncryptContext encryptContext) { |
|||
this.encryptorMap.remove(encryptContext); |
|||
} |
|||
|
|||
/** |
|||
* 根据配置进行加密。会进行本地缓存对应的算法和对应的秘钥信息。 |
|||
* |
|||
* @param value 待加密的值 |
|||
* @param encryptContext 加密相关的配置信息 |
|||
*/ |
|||
public String encrypt(String value, EncryptContext encryptContext) { |
|||
IEncryptor encryptor = this.registAndGetEncryptor(encryptContext); |
|||
return encryptor.encrypt(value, encryptContext.getEncode()); |
|||
} |
|||
|
|||
/** |
|||
* 根据配置进行解密 |
|||
* |
|||
* @param value 待解密的值 |
|||
* @param encryptContext 加密相关的配置信息 |
|||
*/ |
|||
public String decrypt(String value, EncryptContext encryptContext) { |
|||
IEncryptor encryptor = this.registAndGetEncryptor(encryptContext); |
|||
return encryptor.decrypt(value); |
|||
} |
|||
|
|||
/** |
|||
* 通过 typeAliasesPackage 设置的扫描包 扫描缓存实体 |
|||
*/ |
|||
private void scanEncryptClasses(String typeAliasesPackage) { |
|||
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); |
|||
CachingMetadataReaderFactory factory = new CachingMetadataReaderFactory(); |
|||
String[] packagePatternArray = StringUtils.splitPreserveAllTokens(typeAliasesPackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS); |
|||
String classpath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX; |
|||
try { |
|||
for (String packagePattern : packagePatternArray) { |
|||
String path = ClassUtils.convertClassNameToResourcePath(packagePattern); |
|||
Resource[] resources = resolver.getResources(classpath + path + "/*.class"); |
|||
for (Resource resource : resources) { |
|||
ClassMetadata classMetadata = factory.getMetadataReader(resource).getClassMetadata(); |
|||
Class<?> clazz = Resources.classForName(classMetadata.getClassName()); |
|||
Set<Field> encryptFieldSet = getEncryptFieldSetFromClazz(clazz); |
|||
if (CollUtil.isNotEmpty(encryptFieldSet)) { |
|||
fieldCache.put(clazz, encryptFieldSet); |
|||
} |
|||
} |
|||
} |
|||
} catch (Exception e) { |
|||
log.error("初始化数据安全缓存时出错:{}", e.getMessage()); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 获得一个类的加密字段集合 |
|||
*/ |
|||
private Set<Field> getEncryptFieldSetFromClazz(Class<?> clazz) { |
|||
Set<Field> fieldSet = new HashSet<>(); |
|||
// 判断clazz如果是接口,内部类,匿名类就直接返回 |
|||
if (clazz.isInterface() || clazz.isMemberClass() || clazz.isAnonymousClass()) { |
|||
return fieldSet; |
|||
} |
|||
while (clazz != null) { |
|||
Field[] fields = clazz.getDeclaredFields(); |
|||
fieldSet.addAll(Arrays.asList(fields)); |
|||
clazz = clazz.getSuperclass(); |
|||
} |
|||
fieldSet = fieldSet.stream().filter(field -> |
|||
field.isAnnotationPresent(EncryptField.class) && field.getType() == String.class) |
|||
.collect(Collectors.toSet()); |
|||
for (Field field : fieldSet) { |
|||
field.setAccessible(true); |
|||
} |
|||
return fieldSet; |
|||
} |
|||
|
|||
} |
@ -1,7 +1,7 @@ |
|||
package com.inscloudtech.common.encrypt; |
|||
package com.inscloudtech.common.encrypt.core; |
|||
|
|||
import com.inscloudtech.common.enums.AlgorithmType; |
|||
import com.inscloudtech.common.enums.EncodeType; |
|||
import com.inscloudtech.common.encrypt.enumd.AlgorithmType; |
|||
import com.inscloudtech.common.encrypt.enumd.EncodeType; |
|||
|
|||
/** |
|||
* 加解者 |
@ -1,7 +1,7 @@ |
|||
package com.inscloudtech.common.encrypt.encryptor; |
|||
package com.inscloudtech.common.encrypt.core.encryptor; |
|||
|
|||
import com.inscloudtech.common.encrypt.EncryptContext; |
|||
import com.inscloudtech.common.encrypt.IEncryptor; |
|||
import com.inscloudtech.common.encrypt.core.EncryptContext; |
|||
import com.inscloudtech.common.encrypt.core.IEncryptor; |
|||
|
|||
/** |
|||
* 所有加密执行者的基类 |
@ -1,9 +1,9 @@ |
|||
package com.inscloudtech.common.encrypt.encryptor; |
|||
package com.inscloudtech.common.encrypt.core.encryptor; |
|||
|
|||
import com.inscloudtech.common.encrypt.EncryptContext; |
|||
import com.inscloudtech.common.enums.AlgorithmType; |
|||
import com.inscloudtech.common.enums.EncodeType; |
|||
import com.inscloudtech.common.utils.EncryptUtils; |
|||
import com.inscloudtech.common.encrypt.core.EncryptContext; |
|||
import com.inscloudtech.common.encrypt.enumd.AlgorithmType; |
|||
import com.inscloudtech.common.encrypt.enumd.EncodeType; |
|||
import com.inscloudtech.common.encrypt.utils.EncryptUtils; |
|||
|
|||
/** |
|||
* AES算法实现 |
@ -1,9 +1,10 @@ |
|||
package com.inscloudtech.common.encrypt.encryptor; |
|||
package com.inscloudtech.common.encrypt.core.encryptor; |
|||
|
|||
import com.inscloudtech.common.encrypt.core.EncryptContext; |
|||
import com.inscloudtech.common.encrypt.enumd.AlgorithmType; |
|||
import com.inscloudtech.common.encrypt.enumd.EncodeType; |
|||
import com.inscloudtech.common.encrypt.utils.EncryptUtils; |
|||
|
|||
import com.inscloudtech.common.encrypt.EncryptContext; |
|||
import com.inscloudtech.common.enums.AlgorithmType; |
|||
import com.inscloudtech.common.enums.EncodeType; |
|||
import com.inscloudtech.common.utils.EncryptUtils; |
|||
|
|||
/** |
|||
* Base64算法实现 |
@ -1,9 +1,9 @@ |
|||
package com.inscloudtech.common.encrypt.encryptor; |
|||
package com.inscloudtech.common.encrypt.core.encryptor; |
|||
|
|||
import com.inscloudtech.common.encrypt.EncryptContext; |
|||
import com.inscloudtech.common.enums.AlgorithmType; |
|||
import com.inscloudtech.common.enums.EncodeType; |
|||
import com.inscloudtech.common.utils.EncryptUtils; |
|||
import com.inscloudtech.common.encrypt.core.EncryptContext; |
|||
import com.inscloudtech.common.encrypt.enumd.AlgorithmType; |
|||
import com.inscloudtech.common.encrypt.enumd.EncodeType; |
|||
import com.inscloudtech.common.encrypt.utils.EncryptUtils; |
|||
import com.inscloudtech.common.utils.StringUtils; |
|||
|
|||
|
@ -1,10 +1,9 @@ |
|||
package com.inscloudtech.common.encrypt.encryptor; |
|||
package com.inscloudtech.common.encrypt.core.encryptor; |
|||
|
|||
|
|||
import com.inscloudtech.common.encrypt.EncryptContext; |
|||
import com.inscloudtech.common.enums.AlgorithmType; |
|||
import com.inscloudtech.common.enums.EncodeType; |
|||
import com.inscloudtech.common.utils.EncryptUtils; |
|||
import com.inscloudtech.common.encrypt.core.EncryptContext; |
|||
import com.inscloudtech.common.encrypt.enumd.AlgorithmType; |
|||
import com.inscloudtech.common.encrypt.enumd.EncodeType; |
|||
import com.inscloudtech.common.encrypt.utils.EncryptUtils; |
|||
import com.inscloudtech.common.utils.StringUtils; |
|||
|
|||
/** |
@ -1,9 +1,9 @@ |
|||
package com.inscloudtech.common.encrypt.encryptor; |
|||
package com.inscloudtech.common.encrypt.core.encryptor; |
|||
|
|||
import com.inscloudtech.common.encrypt.EncryptContext; |
|||
import com.inscloudtech.common.enums.AlgorithmType; |
|||
import com.inscloudtech.common.enums.EncodeType; |
|||
import com.inscloudtech.common.utils.EncryptUtils; |
|||
import com.inscloudtech.common.encrypt.core.EncryptContext; |
|||
import com.inscloudtech.common.encrypt.enumd.AlgorithmType; |
|||
import com.inscloudtech.common.encrypt.enumd.EncodeType; |
|||
import com.inscloudtech.common.encrypt.utils.EncryptUtils; |
|||
|
|||
/** |
|||
* sm4算法实现 |
@ -1,4 +1,4 @@ |
|||
package com.inscloudtech.common.enums; |
|||
package com.inscloudtech.common.encrypt.enumd; |
|||
|
|||
/** |
|||
* 编码类型 |
@ -1,9 +1,9 @@ |
|||
package com.inscloudtech.framework.filter; |
|||
package com.inscloudtech.common.encrypt.filter; |
|||
|
|||
import cn.hutool.core.io.IoUtil; |
|||
|
|||
import com.inscloudtech.common.constant.Constants; |
|||
import com.inscloudtech.common.utils.EncryptUtils; |
|||
import com.inscloudtech.common.encrypt.utils.EncryptUtils; |
|||
import org.springframework.http.MediaType; |
|||
|
|||
import javax.servlet.ReadListener; |
@ -1,17 +1,14 @@ |
|||
package com.inscloudtech.framework.filter; |
|||
package com.inscloudtech.common.encrypt.filter; |
|||
|
|||
import cn.hutool.core.util.RandomUtil; |
|||
import com.inscloudtech.common.utils.EncryptUtils; |
|||
import com.inscloudtech.common.encrypt.utils.EncryptUtils; |
|||
|
|||
|
|||
import javax.servlet.ServletOutputStream; |
|||
import javax.servlet.WriteListener; |
|||
import javax.servlet.http.HttpServletResponse; |
|||
import javax.servlet.http.HttpServletResponseWrapper; |
|||
import java.io.ByteArrayOutputStream; |
|||
import java.io.IOException; |
|||
import java.io.OutputStreamWriter; |
|||
import java.io.PrintWriter; |
|||
import java.io.*; |
|||
import java.nio.charset.StandardCharsets; |
|||
|
|||
/** |
@ -1,15 +1,13 @@ |
|||
package com.inscloudtech.framework.config.properties; |
|||
package com.inscloudtech.common.encrypt.properties; |
|||
|
|||
import lombok.Data; |
|||
import org.springframework.boot.context.properties.ConfigurationProperties; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
/** |
|||
* api解密属性配置类 |
|||
* @author wdhcr |
|||
*/ |
|||
@Data |
|||
@Component |
|||
@ConfigurationProperties(prefix = "api-decrypt") |
|||
public class ApiDecryptProperties { |
|||
|
@ -1,4 +1,4 @@ |
|||
package com.inscloudtech.common.utils; |
|||
package com.inscloudtech.common.encrypt.utils; |
|||
|
|||
import cn.hutool.core.codec.Base64; |
|||
import cn.hutool.core.util.ArrayUtil; |
@ -0,0 +1,3 @@ |
|||
com.inscloudtech.common.encrypt.config.EncryptorAutoConfiguration |
|||
com.inscloudtech.common.encrypt.config.ApiDecryptAutoConfiguration |
|||
|
@ -1,39 +0,0 @@ |
|||
package com.inscloudtech.framework.config; |
|||
|
|||
import com.inscloudtech.framework.config.properties.EncryptorProperties; |
|||
import com.inscloudtech.framework.manager.EncryptorManager; |
|||
import com.inscloudtech.framework.encrypt.MybatisDecryptInterceptor; |
|||
import com.inscloudtech.framework.encrypt.MybatisEncryptInterceptor; |
|||
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; |
|||
|
|||
/** |
|||
* 加解密配置 |
|||
* |
|||
* @author 老马 |
|||
* @version 4.6.0 |
|||
*/ |
|||
@Configuration |
|||
@ConditionalOnProperty(value = "mybatis-encryptor.enable", havingValue = "true") |
|||
public class EncryptorConfig { |
|||
|
|||
@Autowired |
|||
private EncryptorProperties properties; |
|||
|
|||
@Bean |
|||
public EncryptorManager encryptorManager() { |
|||
return new EncryptorManager(); |
|||
} |
|||
|
|||
@Bean |
|||
public MybatisEncryptInterceptor mybatisEncryptInterceptor(EncryptorManager encryptorManager) { |
|||
return new MybatisEncryptInterceptor(encryptorManager, properties); |
|||
} |
|||
|
|||
@Bean |
|||
public MybatisDecryptInterceptor mybatisDecryptInterceptor(EncryptorManager encryptorManager) { |
|||
return new MybatisDecryptInterceptor(encryptorManager, properties); |
|||
} |
|||
} |
@ -1,96 +0,0 @@ |
|||
package com.inscloudtech.framework.manager; |
|||
|
|||
import cn.hutool.core.util.ReflectUtil; |
|||
import com.inscloudtech.common.annotation.EncryptField; |
|||
import com.inscloudtech.common.encrypt.EncryptContext; |
|||
import com.inscloudtech.common.encrypt.IEncryptor; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
|
|||
import java.lang.reflect.Field; |
|||
import java.util.Arrays; |
|||
import java.util.Map; |
|||
import java.util.Set; |
|||
import java.util.concurrent.ConcurrentHashMap; |
|||
import java.util.stream.Collectors; |
|||
|
|||
/** |
|||
* 加密管理类 |
|||
* |
|||
* @author 老马 |
|||
* @version 4.6.0 |
|||
*/ |
|||
@Slf4j |
|||
public class EncryptorManager { |
|||
|
|||
/** |
|||
* 缓存加密器 |
|||
*/ |
|||
Map<EncryptContext, IEncryptor> encryptorMap = new ConcurrentHashMap<>(); |
|||
|
|||
/** |
|||
* 类加密字段缓存 |
|||
*/ |
|||
Map<Class<?>, Set<Field>> fieldCache = new ConcurrentHashMap<>(); |
|||
|
|||
/** |
|||
* 获取类加密字段缓存 |
|||
*/ |
|||
public Set<Field> getFieldCache(Class<?> sourceClazz) { |
|||
return fieldCache.computeIfAbsent(sourceClazz, clazz -> { |
|||
Field[] declaredFields = clazz.getDeclaredFields(); |
|||
Set<Field> fieldSet = Arrays.stream(declaredFields).filter(field -> |
|||
field.isAnnotationPresent(EncryptField.class) && field.getType() == String.class) |
|||
.collect(Collectors.toSet()); |
|||
for (Field field : fieldSet) { |
|||
field.setAccessible(true); |
|||
} |
|||
return fieldSet; |
|||
}); |
|||
} |
|||
|
|||
/** |
|||
* 注册加密执行者到缓存 |
|||
* |
|||
* @param encryptContext 加密执行者需要的相关配置参数 |
|||
*/ |
|||
public IEncryptor registAndGetEncryptor(EncryptContext encryptContext) { |
|||
if (encryptorMap.containsKey(encryptContext)) { |
|||
return encryptorMap.get(encryptContext); |
|||
} |
|||
IEncryptor encryptor = ReflectUtil.newInstance(encryptContext.getAlgorithm().getClazz(), encryptContext); |
|||
encryptorMap.put(encryptContext, encryptor); |
|||
return encryptor; |
|||
} |
|||
|
|||
/** |
|||
* 移除缓存中的加密执行者 |
|||
* |
|||
* @param encryptContext 加密执行者需要的相关配置参数 |
|||
*/ |
|||
public void removeEncryptor(EncryptContext encryptContext) { |
|||
this.encryptorMap.remove(encryptContext); |
|||
} |
|||
|
|||
/** |
|||
* 根据配置进行加密。会进行本地缓存对应的算法和对应的秘钥信息。 |
|||
* |
|||
* @param value 待加密的值 |
|||
* @param encryptContext 加密相关的配置信息 |
|||
*/ |
|||
public String encrypt(String value, EncryptContext encryptContext) { |
|||
IEncryptor encryptor = this.registAndGetEncryptor(encryptContext); |
|||
return encryptor.encrypt(value, encryptContext.getEncode()); |
|||
} |
|||
|
|||
/** |
|||
* 根据配置进行解密 |
|||
* |
|||
* @param value 待解密的值 |
|||
* @param encryptContext 加密相关的配置信息 |
|||
*/ |
|||
public String decrypt(String value, EncryptContext encryptContext) { |
|||
IEncryptor encryptor = this.registAndGetEncryptor(encryptContext); |
|||
return encryptor.decrypt(value); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,72 @@ |
|||
|
|||
import java.util.HashMap; |
|||
import java.util.Map; |
|||
|
|||
/** |
|||
* |
|||
*/ |
|||
public class JvmMemoryTest { |
|||
//声明缓存对象 |
|||
private static final Map map = new HashMap(); |
|||
|
|||
public static void main(String args[]){ |
|||
try { |
|||
Thread.sleep(100000);//给打开visualvm时间 |
|||
} catch (InterruptedException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
//循环添加对象到缓存 |
|||
for(int i=0; i<1000000;i++){ |
|||
TestMemory t = new TestMemory(); |
|||
map.put("key"+i,t); |
|||
} |
|||
System.out.println("first"); |
|||
//为dump出堆提供时间 |
|||
try { |
|||
Thread.sleep(10000); |
|||
} catch (InterruptedException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
for(int i=0; i<1000000;i++){ |
|||
TestMemory t = new TestMemory(); |
|||
map.put("key"+i,t); |
|||
} |
|||
System.out.println("second"); |
|||
try { |
|||
Thread.sleep(10000); |
|||
} catch (InterruptedException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
for(int i=0; i<3000000;i++){ |
|||
TestMemory t = new TestMemory(); |
|||
map.put("key"+i,t); |
|||
} |
|||
System.out.println("third"); |
|||
try { |
|||
Thread.sleep(10000); |
|||
} catch (InterruptedException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
for(int i=0; i<4000000;i++){ |
|||
TestMemory t = new TestMemory(); |
|||
map.put("key"+i,t); |
|||
} |
|||
System.out.println("forth"); |
|||
try { |
|||
Thread.sleep(Integer.MAX_VALUE); |
|||
} catch (InterruptedException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
System.out.println("qqqq"); |
|||
} |
|||
|
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
/** |
|||
* |
|||
*/ |
|||
class TestMemory { |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue