Spring Boot 在启动时进行配置文件加解密

  • 寻找到application.yml的读取的操作。
  • 从spring.factories 中查看到
# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.context.config.ConfigFileApplicationListener,\
  • ConfigFileApplicationListener 该对象对application.yml进行读取操作
  • ConfigFileApplicationListener 事件的监听器, 继承了SmartApplicationListener接口
  • SmartApplicationListener 接口继承了ApplicationListener 和 Ordered接口,能够实现有序监听。

一、SmartApplicationListener介绍

  • Spring ApplicationEvent以及对应的Listener提供了一个事件监听、发布订阅的实现,内部实现方式是观察者模式,可以解耦业务系统之间的业务,提供系统的可拓展性、复用性以及可维护性。
  • 在application.yml文件读取完会触发一个事件ConfigFileApplicationListener 该监听器实现文件的读取。
  • SmartApplicationListener是高级监听器,是ApplicationListener的子类,能够实现有序监听
  • SmartApplicationListener提供了两个方法:
/**
 * 指定支持哪些类型的事件
 */
boolean supportsEventType(Class<? extends ApplicationEvent> var1);

/**
 * 指定支持发生事件所在的类型
 */
boolean supportsSourceType(Class<?> var1);

如何在 SmartApplicationListener 实现监听解耦

1、我们只需在加载完成之后去加入一个监听器。
2、继承SmartApplicationListener接口
3、设置order属性决定监听器的顺序 ConfigFileApplicationListener.DEFAULT_ORDER + 1
4、将application.yml内容读取之后并修改

二、ConfigFileApplicationListener

  • ConfigFileApplicationListener 是用来 读取配置文件的。 可以这样来粗劣的介绍一下
  • 详情可以请看 springboot启动时是如何加载配置文件application.yml文件

三、最终结果:

  • 新增一个监听器 既然我们要在配置文件加载之后搞事情那么我们直接复制ConfigFileApplicationListener 的实现方式
  • 删除一下不需要处理的操作(大概就是以下代码) 并且order在ConfigFileApplicationListener 之后
public class AfterConfigListener implements SmartApplicationListener,Ordered {

 public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
  return ApplicationEnvironmentPreparedEvent.class.isAssignableFrom(eventType) || ApplicationPreparedEvent.class.isAssignableFrom(eventType);
 }
 public void onApplicationEvent(ApplicationEvent event) {
  if (event instanceof ApplicationEnvironmentPreparedEvent) {
  }
  if (event instanceof ApplicationPreparedEvent) {
  }
 }
 @Override
 public int getOrder() {
  // 写在加载配置文件之后
  return ConfigFileApplicationListener.DEFAULT_ORDER + 1;
 }
}
  • 这样子就完成了配置文件之后的代码监听。 SmartApplicationListener又是实现了ApplicationListener的监听的,那么我们可以在onApplicationEvent执行代码。
  • 完善代码如下。 监听并且获取配置文件内容
public class AfterConfigListener implements SmartApplicationListener,Ordered {
 // 复制的ConfigFileApplicationListener文件内容
 public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
  return ApplicationEnvironmentPreparedEvent.class.isAssignableFrom(eventType) || ApplicationPreparedEvent.class.isAssignableFrom(eventType);
 }

 public void onApplicationEvent(ApplicationEvent event) {
  // ApplicationEnvironmentPreparedEvent 是加载配置文件,初始化日志系统的事件。
  if (event instanceof ApplicationEnvironmentPreparedEvent) {
   // 获得原来的password内容
   String password = ((ApplicationEnvironmentPreparedEvent) event).getEnvironment().getProperty("spring.datasource.password");

   // 进行密码的解密
    System.setProperty("spring.datasource.password", SM4Utils.encryptData_ECB(password));
  }

  if (event instanceof ApplicationPreparedEvent) {
  }
 }
 @Override
 public int getOrder() {
  // 设置该监听器 在加载配置文件之后执行
  return ConfigFileApplicationListener.DEFAULT_ORDER + 1;
 }

}
  • 并且在main方法中加入该监听器
public class Application {

 public static void main(String[] args) {
  SpringApplication springApplication = new SpringApplication(Application.class);
  springApplication.addListeners(new AfterConfigListener());
  springApplication.run(args);
 }

}

总结

到此这篇关于Spring Boot 在启动时进行配置文件加解密的文章就介绍到这了,更多相关Spring Boot配置文件加解密内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot实现接口数据的加解密功能

    一.加密方案介绍 对接口的加密解密操作主要有下面两种方式: 自定义消息转换器 优势:仅需实现接口,配置简单. 劣势:仅能对同一类型的MediaType进行加解密操作,不灵活. 使用spring提供的接口RequestBodyAdvice和ResponseBodyAdvice 优势:可以按照请求的Referrer.Header或url进行判断,按照特定需要进行加密解密. 比如在一个项目升级的时候,新开发功能的接口需要加解密,老功能模块走之前的逻辑不加密,这时候就只能选择上面的第二种方式了,下面主要

  • SpringMvc/SpringBoot HTTP通信加解密的实现

    前言 从去年10月份到现在忙的没时间写博客了,今天就甩给大家一个干货吧!!! 近来很多人问到下面的问题 我们不想在每个Controller方法收到字符串报文后再调用一次解密,虽然可以完成,但是很low,且如果想不再使用加解密,修改起来很是麻烦. 我们想在使用Rest工具或swagger请求的时候不进行加解密,而在app调用的时候处理加解密,这可如何操作. 针对以上的问题,下面直接给出解决方案: 实现思路 APP调用API的时候,如果需要加解密的接口,需要在httpHeader中给出加密方式,如h

  • Spring boot配置文件加解密详解

    功能介绍 大家都知道在Spring boot开发过程中,需要在配置文件里配置许多信息,如数据库的连接信息等,如果不加密,传明文,数据库就直接暴露了,相当于"裸奔"了,因此需要进行加密处理才行. 在项目中使用jasypt-1.9.4.jar包,能够实现对明文进行加密,对密文进行解密.配置相关加密信息,就能够实现在项目运行的时候,自动把配置文件中已经加密的信息解密成明文,供程序使用 下面话不多说了,来一起看看详细的介绍吧 使用说明 1.pom引入依赖 <dependency>

  • Spring Boot 实现配置文件加解密原理

    背景 接上文<失踪人口回归,mybatis-plus 3.3.2 发布>[1] ,提供了一个非常实用的功能 「数据安全保护」 功能,不仅支持数据源的配置加密,对于 spring boot 全局的 yml /properties 文件均可实现敏感信息加密功能,在一定的程度上控制开发人员流动导致敏感信息泄露. // 数据源敏感信息加密 spring: datasource: url: mpw:qRhvCwF4GOqjessEB3G+a5okP+uXXr96wcucn2Pev6BfaoEMZ1gVp

  • Spring Boot 在启动时进行配置文件加解密

    寻找到application.yml的读取的操作. 从spring.factories 中查看到 # Application Listeners org.springframework.context.ApplicationListener=\ org.springframework.boot.context.config.ConfigFileApplicationListener,\ ConfigFileApplicationListener 该对象对application.yml进行读取操作

  • Spring Boot 在启动时进行配置文件加解密的方法详解

    寻找到application.yml的读取的操作. 从spring.factories 中查看到 # Application Listeners org.springframework.context.ApplicationListener=\ org.springframework.boot.context.config.ConfigFileApplicationListener,\ ConfigFileApplicationListener 该对象对application.yml进行读取操作

  • Spring Boot jar 启动时设置环境参数的操作

    Spring Boot jar 启动时设置环境参数 1 摘要 通常在使用 Spring Boot 开发项目时需要设置多环境(测试环境与生产环境等),但是项目打包却只能指定一种环境,有没有一种办法,能够只打一个 jar 包,但是启动的时候指定项目环境?作者经过在网上查阅资料并测试,发现这一功能可以实现,这就大大方便了项目的部署工作(可以实现多环境自动部署). 2 核心代码 2.1 spring Boot 多环境配置 ../demo-web/src/main/resources/applicatio

  • 详解Spring Boot 项目启动时执行特定方法

    Springboot给我们提供了两种"开机启动"某些方法的方式:ApplicationRunner和CommandLineRunner. 这两种方法提供的目的是为了满足,在项目启动的时候立刻执行某些方法.我们可以通过实现ApplicationRunner和CommandLineRunner,来实现,他们都是在SpringApplication 执行之后开始执行的. CommandLineRunner接口可以用来接收字符串数组的命令行参数,ApplicationRunner 是使用App

  • 详解spring boot应用启动原理分析

    前言 本文分析的是spring boot 1.3. 的工作原理.spring boot 1.4. 之后打包结构发现了变化,增加了BOOT-INF目录,但是基本原理还是不变的. 关于spring boot 1.4.* 里ClassLoader的变化,可以参考://www.jb51.net/article/141479.htm spring boot quick start 在spring boot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启动

  • springboot启动时是如何加载配置文件application.yml文件

    今天启动springboot时,明明在resources目录下面配置了application.yml的文件,但是却读不出来,无奈看了下源码,总结一下springboot查找配置文件路径的过程,能力有限,欢迎各位大牛指导!!! spring加载配置文件是通过listener监视器实现的,在springboot启动时: 在容器启动完成后会广播一个SpringApplicationEvent事件,而SpringApplicationEvent事件是继承自ApplicationEvent时间的,代码如下

  • 详解springboot启动时是如何加载配置文件application.yml文件

    今天启动springboot时,明明在resources目录下面配置了application.yml的文件,但是却读不出来,无奈看了下源码,总结一下springboot查找配置文件路径的过程,能力有限,欢迎各位大牛指导!!! spring加载配置文件是通过listener监视器实现的,在springboot启动时: 在容器启动完成后会广播一个SpringApplicationEvent事件,而SpringApplicationEvent事件是继承自ApplicationEvent时间的,代码如下

  • java启动时自定义配置文件路径,自定义log4j2.xml位置方式

    目录 java启动时自定义配置文件路径,自定义log4j2.xml位置 启动时指定配置文件位置 有一种说法:说配置文件加载顺序为(由高到低) 经验证 后来又发现一个问题 如果启动不了 java服务启动指定配置文件路径 java启动时自定义配置文件路径,自定义log4j2.xml位置 启动时指定配置文件位置 项目打成jar包后,配置文件会一起打包到jar包的classes下,这就是所说的classpath.比如spring boot 就是在jar\BOOT-INF\classes下 然后在jar文

  • Spring Boot修改启动端口的方法

    spring boot是个好东西,可以不用容器直接在main方法中启动,而且无需配置文件,方便快速搭建环境.可是当我们要同时启动2个springboot工程时,就会有问题,有可能会因为8080端口被第一个应用占用而导致第二个应用无法启动,这时就需要修改其中一个工程的启动端口. 1.可以通过实现EmbeddedServletContainerCustomizer接口来实现: public class Application extends SpringBootServletInitializer

随机推荐