这种方式是主要是利用了spring加载顺序,因为在加载c3p0加载之前先对配置文件中的密码进行相应的解密,并且注入到属性password中,这样在创建c3p0连接的时候,用的密码就是明文密码了
/*注意,这里有个先后顺序的问题,<property name="properties"> 必须要在前面 ${env}是环境变量 开发,测试,生产,灰度*/
<bean id="C3p0DataSource" class="com.zns.tool.C3p0DataSource">
<property name="properties">
<props>
<prop key="user" >${${env}.boms.jdbc.username}</prop>
<prop key="password" >${${env}.boms.jdbc.password}</prop>
<prop key="jdbcUrl" >${${env}.boms.jdbc.url}</prop>
</props>
</property>
</bean>
<!--组织架构数据源-->
<bean id="bomsDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
<property name="driverClass" value="${${env}.boms.jdbc.driver}"/>
<property name="properties" ref="dataSourceProperties"/>
<property name="jdbcUrl" value="${${env}.boms.jdbc.url}"/>
<property name="user" value="${${env}.boms.jdbc.username}"/>
<property name="password" value="${${env}.boms.jdbc.password}"/>
<property name="initialSize" value="5"/>
<property name="maxActive" value="50"/>
<property name="maxIdle" value="2"/>
<property name="minIdle" value="1"/>
<property name="defaultAutoCommit" value="true"/>
</bean>
下面是读取属性然后解密再把属性传给链接池 DBCP PROXOLL DURID C3P0等等
package com.zns.tool;
//import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.util.Properties;
import org.springframework.beans.factory.FactoryBean;
import com.zns.tool.SecUtil;
public final class C3p0DataSource implements FactoryBean
{
private Properties properties; /*SPRING的属性对象*/
private SecUtil SecEncryptObj; /*安全对象里面有加密解密算法*/
/*对虚类方法的继承实现,照抄*/
public Object getObject() throws Exception { return getProperties(); }
public Class getObjectType() { return java.util.Properties.class; }
public boolean isSingleton() { return true; }
public Properties getProperties() { return properties; }
public void setProperties(Properties inProperties)
{
SecEncryptObj = new SecUtil();
this.properties = inProperties;
String EncryUsername = properties.getProperty("user");
String EncryPassword = properties.getProperty("password");
String EncryJdbcUrl = properties.getProperty("JdbcUrl");
if (EncryUsername != null)
{
try {
String DecryUsername = SecEncryptObj.decrypt(EncryUsername);
properties.put("user", DecryUsername);
} catch (Exception e) { e.printStackTrace(); }
}
if (EncryPassword != null)
{
try {
String DecryPassword = SecEncryptObj.decrypt(EncryPassword);
properties.put("password", DecryPassword);
} catch (Exception e) { e.printStackTrace(); }
}
if (EncryJdbcUrl != null)
{
try {
String DecryJdbcUrl = SecEncryptObj.decrypt(EncryJdbcUrl);
properties.put("JdbcUrl", DecryJdbcUrl);
} catch (Exception e) { e.printStackTrace(); }
}
}
}
关于加密和解密算法 就好多实现的方法了,自然那种单向加密就算了,毕竟解密需要好长时间.
这里给出前同事 康师傅写的加密和解密方法
这个不好,想看去我公众号查看