1、springboot的版本号是2.0.5;
配置文件是yml格式的,文件名为application.yml;
snakeyaml的版本为snakeyaml-1.19.jar。
2、需求:把配置文件里password的换成加密后的值,加密算法不限。
3、方案:在启动类的main方法开头,将password的值取出来,解密,然后再保存到application.yml文件中,具体代码如下:
public static void main(String[] args) throws Exception {
String path = Application.class.getClassLoader().getResource("application.yml").getPath();
//windows系统路径中带有盘符,需要把开头的斜杠去掉
if(path.indexOf(":")>-1){
path = path.substring(1);
}
//System.out.println("path=" + path);
try{
Yaml yaml = new Yaml();
File file = new File(path);
Map<String,Object> map = yaml.load(new FileInputStream(file));
Map<String,Object> m2 = (Map<String,Object>) map.get("spring");
Map<String,Object> m3 = (Map<String,Object>) m2.get("datasource");
String pw = m3.get("password")+"";
//System.out.println("pw=" + pw+"=");
//JasyptUtil为自己定义的加密解密工具类
//System.out.println("pw 明文=" + JasyptUtil.DecodeJasypt(pw)+"=");
m3.put("password", JasyptUtil.DecodeJasypt(pw));
FileWriter fw = new FileWriter(path);
yaml.dump(map, fw);
fw.close();
}catch(Exception e){
e.printStackTrace();
}
SpringApplication.run(Application.class, args);
}
4、以上修改方法,对于在IDE环境中运行有效,但对于打包后的jar,则通过path无法得到输入流和输出流。解决方案:把application.yml文件放到jar包外部,比如和jar同级目录,则此时:
String path = System.getProperty("user.dir")+File.separator + "application.yml";
然后在执行jar包的时候指定配置文件路径,如:
java -jar XXX.jar --spring.config.path=application.yml
5、解密后,新的配置文件里已经变成了明文,解决方法:在项目跑起来之后,再把密文写到外部配置文件里,可以根据实际项目启动时间,估算数据库配置信息读取之后,再写回密文。