做網(wǎng)站怎么做小圖標免費做網(wǎng)站怎么做網(wǎng)站
一、前言
之前我寫過一篇文章使用SM4國密加密算法對Spring Boot項目數(shù)據(jù)庫連接信息以及yaml文件配置屬性進行加密配置(讀取時自動解密),對Spring Boot項目的屬性讀取時進行加解密,但是沒有說明對System.setProperty(key, value)設(shè)置的屬性進行讀取加解密,這個在開發(fā)過程中應(yīng)該怎么實現(xiàn)呢?
二、開發(fā)方案
前置步驟我們在這里不再描述了,可以參考使用SM4國密加密算法對Spring Boot項目數(shù)據(jù)庫連接信息以及yaml文件配置屬性進行加密配置(讀取時自動解密),我們這里參考一下解決方案。
1. 通過擴展EnvironmentPostProcessor接口進行參數(shù)解密
1.1 示例代碼
import com.learn.SM4Utils; // 自己實現(xiàn)的SM4算法工具類
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;import java.util.Map;
import java.util.Properties;
import java.util.Set;public class MyEnv implements EnvironmentPostProcessor {@Overridepublic void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {// 獲取所有系統(tǒng)參數(shù)Properties properties = System.getProperties();// 遍歷Set<Map.Entry<Object, Object>> entries = properties.entrySet();for (Map.Entry<Object, Object> entry : entries) {// 獲取設(shè)置值Object value = entry.getValue();if (value != null) {String v = (String) value;if (v.startsWith(SM4Utils.SM4_PREFIX)) { // 判斷是否進行了加密配置// 進行解密,然后重新設(shè)置System.setProperty((String) entry.getKey(), SM4Utils.decryptStr(v));}}}}
}
1.2 注冊自定義EnvironmentPostProcessor處理器
在resource目錄下新建META-INF目錄,新建spring.factories文件
,添加如下內(nèi)容:
org.springframework.boot.env.EnvironmentPostProcessor=\com.learn.env.MyEnv
1.3 測試
示例代碼:
SpringBootApplication
public class JenkinsDemo01Application {public static void main(String[] args) {String s = SM4Utils.encryptStr("hello,CSDN!");System.out.println("設(shè)置的value:" + s);System.setProperty("testKey", s);SpringApplication.run(JenkinsDemo01Application.class, args);System.out.println("獲取的value:" + System.getProperty("testKey"));}}
測試結(jié)果:
)
2. 通過實現(xiàn)ApplicationListener事件監(jiān)聽實現(xiàn)
2.1 示例代碼
import com.learn.SM4Utils;
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.context.ApplicationListener;import java.util.Map;
import java.util.Properties;
import java.util.Set;public class MyEventListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {@Overridepublic void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {// 獲取所有系統(tǒng)參數(shù)Properties properties = System.getProperties();// 遍歷Set<Map.Entry<Object, Object>> entries = properties.entrySet();for (Map.Entry<Object, Object> entry : entries) {// 獲取設(shè)置值Object value = entry.getValue();if (value != null) {String v = (String) value;if (v.startsWith(SM4Utils.SM4_PREFIX)) { // 判斷是否進行了加密配置// 進行解密,然后重新設(shè)置System.setProperty((String) entry.getKey(), SM4Utils.decryptStr(v));}}}}
}
1.2 注冊自定義ApplicationListener事件監(jiān)聽
在resource目錄下新建META-INF目錄,新建spring.factories文件
,添加如下內(nèi)容:
org.springframework.context.ApplicationListener=\com.learn.event.MyEventListener
1.3 測試
示例代碼:
SpringBootApplication
public class JenkinsDemo01Application {public static void main(String[] args) {String s = SM4Utils.encryptStr("hello,CSDN!");System.out.println("設(shè)置的value:" + s);System.setProperty("testKey", s);SpringApplication.run(JenkinsDemo01Application.class, args);System.out.println("獲取的value:" + System.getProperty("testKey"));}}
測試結(jié)果:
通過以上兩種方式,可以在項目啟動過程中獲取設(shè)置System參數(shù),進行解密,這樣獲取的時候就是解密以后的參數(shù)了。