【IT168技术文档】
编写支持加密属性文件的实现类
通过以上分析,我们设计一个支持加密属性文件的增强型PropertyPlaceholderConfigurer,其代码如所示:
代码清单 2 DecryptPropertyPlaceholderConfigurer
对locations指定的属性文件流数据进行额外的解密工作,解密后再装载到props中。比起PropertyPlaceholderConfigurer,我们只做了额外的一件事:装载前对属性资源进行解密。package com.baobaotao;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.Key;
import java.util.Properties;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.core.io.Resource;
import org.springframework.util.DefaultPropertiesPersister;
import org.springframework.util.PropertiesPersister;
public class DecryptPropertyPlaceholderConfigurer
extends PropertyPlaceholderConfigurer ...{
private Resource[] locations; ① 重新定义父类中的这个同名属性
private Resource keyLocation; ② 用于指定密钥文件
public void setKeyLocation(Resource keyLocation) ...{
this.keyLocation = keyLocation;
}
public void setLocations(Resource[] locations) ...{
this.locations = locations;
}
public void loadProperties(Properties props) throws IOException ...{
if (this.locations != null) ...{
PropertiesPersister propertiesPersister = new DefaultPropertiesPersister();
for (int i = 0; i < this.locations.length; i++) ...{
Resource location = this.locations[i];
if (logger.isInfoEnabled()) ...{
logger.info("Loading properties file from " + location);
}
InputStream is = null;
try ...{
is = location.getInputStream();
③ 加载密钥
Key key = DESEncryptUtil.getKey(keyLocation.getInputStream());
④ 对属性文件进行解密
is = DESEncryptUtil.doDecrypt(key, is);
⑤ 将解密后的属性流装载到props中
if(fileEncoding != null)...{
propertiesPersister.load(props,
new InputStreamReader(is,fileEncoding));
}else...{
propertiesPersister.load(props ,is);
}
} finally ...{
if (is != null)
is.close();
}
}
}
}
}
}
在代码清单 2的③和④处,我们使用了一个DES解密的工具类对加密的属性文件流进行解密。
