1、前段时间项目终于到一个这样的难题,项目经理说系统资源连接信息,不能明文存在项目中,有一些同时开始思考着,配置文件加密之类的东西,后来突然闪现一个想法,
既然配置信息不让明文存在,我直接不要配置文件了,这不更直接吗?当时的主要思路就是把系统的配置信息存储到操作系统的环境变量中,问题的关键是怎么从环境变量中获取。
2、下面我们来介绍一下传统的web项目,spring配置及数据库等连接信息
<!-- 系统配置信息,从操作系统环境变量获取 -->
<context:property-placeholder ignore-resource-not-found="true" location="classpath*:/properties/application*.properties" />
jdbc.driver=com.mysql.jdbc.Driver
jdbc.pcsearch.url=jdbc:mysql://127.0.0.1:3306/test
jdbc.pcsearch.username=root
jdbc.pcsearch.password=root
<bean id="baseDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass">
<value>${jdbc.driver}</value>
</property>
<property name="jdbcUrl">
<value>${jdbc.pcsearch.url}</value>
</property>
<property name="user">
<value>${jdbc.pcsearch.username}</value>
</property>
<property name="password">
<value>${jdbc.pcsearch.username}</value>
</property>
<!--连接池中保留的最大连接数。默认值: 15 -->
<property name="maxPoolSize" value="${c3p0.maxPoolSize}" />
<!-- 连接池中保留的最小连接数,默认为:3 -->
<property name="minPoolSize" value="${c3p0.minPoolSize}" />
<!-- 初始化连接池中的连接数,取值应在minPoolSize与maxPoolSize之间,默认为3 -->
<property name="initialPoolSize" value="${c3p0.initialPoolSize}" />
<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。默认值: 0 -->
<property name="maxIdleTime" value="${c3p0.maxIdleTime}" />
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。默认值: 3 -->
<property name="acquireIncrement" value="${c3p0.acquireIncrement}" />
<!--每60秒检查所有连接池中的空闲连接。默认值: 0,不检查 -->
<property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}" />
<!--c3p0全局的PreparedStatements缓存的大小。-->
<property name="maxStatements" value="${c3p0.maxStatements}" />
</bean>
3、现在我们来研究一下,将配置信息存储到操作系统的环境变量中该如何修改:
将
<!-- 系统配置信息,从操作系统环境变量获取 -->
<context:property-placeholder ignore-resource-not-found="true" location="classpath*:/properties/application*.properties" />
修改为
<!-- 系统配置信息,从操作系统环境变量获取 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" />
后面的el表达式取值和前面一样不用做任何改动,需要注意的是系统环境变量配置完之后需要冲洗eclipse,否则环境变量不能立即生效。
4、Spring的PropertyPlaceholderConfiguer类默认是打开的,我们可以不再spring中添加如下配置:
<!-- 系统配置信息,从操作系统环境变量获取 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" />
,当然添加也不会出错,当项目中同时存在*.properties和PropertyPlaceholderConfiguer类时。spring会优先从操作系统的环境变量中获取。
相关参考文件:
http://blog.csdn.net/yakoo5/article/details/18089731
https://unmi.cc/spring-injection-system-properties-env/