Java实现.env文件读取敏感数据

ops/2025/2/4 4:10:57/

文章目录

    • 1.common-env-starter模块
        • 1.目录结构
        • 2.DotenvEnvironmentPostProcessor.java 在${xxx}解析之前执行,提前读取配置
        • 3.EnvProperties.java 这里的path只是为了代码提示
        • 4.EnvAutoConfiguration.java Env模块自动配置类
        • 5.spring.factories 自动配置和注册EnvironmentPostProcessor
        • 6.pom.xml
    • 2.common-env-starter-demo模块
        • 1.目录结构
        • 2.pom.xml
        • 3.application.yml 配置测试的数据
        • 4.EnvConfig.java
        • 5.EnvApplication.java 启动类
        • 6.测试

1.common-env-starter模块

1.目录结构

CleanShot 2025-01-10 at 20.38.24@2x

java_xxx_8">2.DotenvEnvironmentPostProcessor.java 在${xxx}解析之前执行,提前读取配置
java">package com.sunxiansheng.env.processor;import io.github.cdimascio.dotenv.Dotenv;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;/*** Description: 在${xxx}解析之前执行,可以读取xxx,设置到环境中,在后续的解析时就会进行替换了** @Author sun* @Create 2025/1/10 19:40* @Version 1.0*/
public class DotenvEnvironmentPostProcessor implements EnvironmentPostProcessor{@Overridepublic void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {// 从 Spring 的配置中获取 sun-rays.env.pathString dotenvPath = environment.getProperty("sun-rays.env.path");if (dotenvPath != null) {// 加载 .env 文件Dotenv dotenv = Dotenv.configure().directory(dotenvPath).filename(".env").load();// 将 .env 中的值注入到系统属性中,确保占位符解析时可用dotenv.entries().forEach(entry ->environment.getSystemProperties().put(entry.getKey(), entry.getValue()));System.out.println("Loaded .env from path: " + dotenvPath);} else {System.err.println("sun-rays.env.path not configured!");}}
}
java_path_52">3.EnvProperties.java 这里的path只是为了代码提示
java">package com.sunxiansheng.env.config.properties;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;/*** Description: 这里的path只是为了代码提示,实际上DotenvEnvironmentPostProcessor.java不从这里获取配置** @Author sun* @Create 2025/1/10 20:04* @Version 1.0*/
@ConfigurationProperties(prefix = "sun-rays.env")
@Data
public class EnvProperties {/*** .env文件的绝对路径*/private String path;
}
java_Env_78">4.EnvAutoConfiguration.java Env模块自动配置类
java">package com.sunxiansheng.env.config;import com.sunxiansheng.env.config.properties.EnvProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;import javax.annotation.PostConstruct;/*** Description: Env模块自动配置类** @Author sun* @Create 2025/1/10 19:57* @Version 1.0*/
@Configuration
@EnableConfigurationProperties({EnvProperties.class}) // 启用配置类
@Slf4j
public class EnvAutoConfiguration {/*** 自动配置成功日志*/@PostConstructpublic void logConfigSuccess() {log.info("EnvAutoConfiguration has been loaded successfully!");}
}
5.spring.factories 自动配置和注册EnvironmentPostProcessor
java">org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.sunxiansheng.env.config.EnvAutoConfiguration
org.springframework.boot.env.EnvironmentPostProcessor=\
com.sunxiansheng.env.processor.DotenvEnvironmentPostProcessor
6.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.sunxiansheng</groupId><artifactId>sunrays-common</artifactId><version>2.0.0</version></parent><artifactId>common-env-starter</artifactId><dependencies><!-- 可以使用.env文件提前加载配置,确保数据安全 --><dependency><groupId>io.github.cdimascio</groupId><artifactId>java-dotenv</artifactId></dependency></dependencies>
</project>

2.common-env-starter-demo模块

1.目录结构

CleanShot 2025-01-10 at 21.03.43@2x

2.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.sunxiansheng</groupId><artifactId>sunrays-common-demo</artifactId><version>2.0.0</version></parent><artifactId>common-env-starter-demo</artifactId><dependencies><!-- common-env-starter --><dependency><groupId>com.sunxiansheng</groupId><artifactId>common-env-starter</artifactId><version>2.0.0</version></dependency></dependencies>
</project>
3.application.yml 配置测试的数据
sun-rays:log4j2:home: /Users/sunxiansheng/IdeaProjects/sunrays-framework/sunrays-common-demo/common-env-starter-demo/logs # 日志根目录(默认./logs)module: sunrays-common-demo/common-env-starter-demo # 模块根目录从仓库根目录开始(默认defaultModule)env:path: /Users/sunxiansheng/IdeaProjects/sunrays-framework/sunrays-common-demo/common-env-starter-demo # .env文件的绝对路径
env:test: ${ENV_TEST}
java_193">4.EnvConfig.java
java">package com.sunxiansheng.env.config;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;import javax.annotation.PostConstruct;/*** Description: Env配置类,测试读取数据** @Author sun* @Create 2025/1/10 20:55* @Version 1.0*/
@Configuration
@Slf4j
public class EnvConfig {@Value("${env.test}")private String test;@PostConstructpublic void init() {// 测试读取log.info("test={}", test);}
}
java__226">5.EnvApplication.java 启动类
java">package com.sunxiansheng.env;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** Description: Env** @Author sun* @Create 2025/1/10 20:53* @Version 1.0*/
@SpringBootApplication
public class EnvApplication {public static void main(String[] args) {SpringApplication.run(EnvApplication.class, args);}
}
6.测试

CleanShot 2025-01-10 at 21.07.43@2x

CleanShot 2025-01-10 at 21.07.53@2x


http://www.ppmy.cn/ops/155471.html

相关文章

rust跨平台调用动态库

动态库在不同的操作系统&#xff0c;扩展名是不一样的&#xff0c;所以要做处理: static LIB: Lazy<Mutex<Option<Library>>> Lazy::new(|| Mutex::new(None));type CreateFunc unsafe extern "C" fn(*const c_char, *const c_char) -> c_int…

亚博microros小车-原生ubuntu支持系列:19 nav2 导航

开始小车测试之前&#xff0c;先补充下背景知识 nav2 Navigation2具有下列工具&#xff1a; 加载、提供和存储地图的工具&#xff08;地图服务器Map Server&#xff09; 在地图上定位机器人的工具 (AMCL) 避开障碍物从A点移动到B点的路径规划工具&#xff08;Nav2 Planner&a…

高速PCB设计指南2——PCB设计的信号完整性

高速PCB设计指南2——PCB设计的信号完整性 1. 信号完整性定义2. 信号完整性的需求3. 导致PCB中信号完整性的问题3.1 阻抗不连续3.2 反射、振铃、过冲3.3 串扰3.4 过孔残桩&#xff08;Stub&#xff09;3.5 偏移&#xff08;Jitter&#xff09;和抖动(Skew)3.6 信号衰减&#xf…

基于Docker以KRaft模式快速部署Kafka

参考文献 https://kafka.apache.org/37/documentation.html#uses https://spring.io/projects/spring-kafka#overview 获取Docker镜像 docker pull apache/kafka:3.7.1 创建一个目录来存储Kafka的配置文件 mkdir -p /home/user/kafka_config 启动Kafka容器 docker run …

RabbitMQ5-死信队列

目录 死信的概念 死信的来源 死信实战 死信之TTl 死信之最大长度 死信之消息被拒 死信的概念 死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;一般来说&#xff0c;producer 将消息投递到 broker 或直接到queue 里了&#xff0c;consumer 从 queue 取出消息进…

分布式微服务系统架构第87集:kafka

Kafka 就是为了解决上述问题而设计的一款基于发布与订阅的消息系统。它一般被称为 “分布式提交日志”或者“分布式流平台”。文件系统或数据库提交日志用来提供所有事务 的持久记录&#xff0c;通过重放这些日志可以重建系统的状态。同样地&#xff0c;Kafka 的数据是按照一定…

WebForms SortedList 深度解析

WebForms SortedList 深度解析 引言 在Web开发领域,对于数据结构的理解与应用至关重要。其中,SortedList类在WebForms中是一个常用的数据结构,它能够帮助开发者高效地管理有序数据集合。本文将深入解析SortedList类在WebForms中的应用,包括其基本概念、常用方法、性能特点…

javaEE-7.网络原理-HTTPS

目录 1.概念: 2.加密形式 3.HTTPS工作流程 1).引入对称加密 2).引入非对称加密 1.概念: https是http的加密版. HTTPS : HTTP SSL(加密) HTTP属于明文传输,在传输过程中,可能会存在一定的风险,HTTPS对传输的内容进行了加密处理. HTTPS除了对内容进行密文传输,别的和HTTP是…