将配置文件用户相关的信息(例如:密码)进行加密使其以密文形式存在,进行初始化连接池的时候进行解密 *** 作,达到成功创建连接池的目的。Tomcat默认使用DBCP连接池(基于common-pool的一种连接池实现),对org.apache.commons.dbcp.BasicDataSourceFactory类修改,把数据库密码字段(加密后的密文)用解密程序解密,获得解密后的明文即可。
具体实现:
1. 修改org.apache.commons.dbcp.BasicDataSourceFactory类文件
找到数据源密码设置部分
value = properties.getProperty(PROP_PASSWORD)
if (value != null) {
dataSource.setPassword(value)
}
修改为:
value = properties.getProperty(PROP_PASSWORD)
if (value != null) {
dataSource.setPassword(Encode.decode(value))
}
将配置文件中的“密码”(加密后的结果)取出,调用加解密类中的解密方法Encode.decode(value)进行解密。
2. 加密类Encode.java,本例中使用加密解密模块比较简单只是用来说明问题,密文为明文的十六进制串。
public class Encode {
//编码-普通字符串转为十六进制字符串
public static String encode(String password){
String result = “”
byte[] psd = password.getBytes()
for(int i=0i<psd.lengthi++){
result += Integer.toHexString(psd[i]&0xff)
}
return result
}
//解码–十六进制字符串转为普通字符串
public static String decode(String password){
String result = “”
password = password.toUpperCase()
int length = password.length() / 2
char[] hexChars = password.toCharArray()
byte[] d = new byte[length]
for (int i = 0i <lengthi++) {
int pos = i * 2
d[i] = (byte) (charToByte(hexChars[pos]) <<4 | charToByte(hexChars[pos + 1]))
}
result = new String(d)
return result
}
//字符转字节
public static byte charToByte(char c) {
return (byte) “0123456789ABCDEF”.indexOf(c)
}
}
3. 数据库连接池文件,红色字体为数据源配置中密码设置,此时已经改为密文形式。
<?xml version=’1.0′ encoding=’utf-8′?>
<Context docBase=”reportmis” path=”/reportmis” privileged=”true” workDir=”work\Catalina\localhost\reportmis”>
<Resource auth=”Container” name=”mis2datasource” type=”javax.sql.DataSource”/>
<ResourceParams name=”mis2datasource”>
<parameter>
<name>password</name>
<value>696e65743231</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@127.0.0.1:1521:orcl</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>
<parameter>
<name>username</name>
<value>wanfang</value>
</parameter>
</ResourceParams>
</Context>
4. 将修改后的BasicDataSourceFactory.java和新添加的Encode.java编译后的class类文件重新打包进commons-dbcp-1.4.jar,将该包拷贝进tomcat下的common/lib目录中,重启tomcat。此时tomcat下部署的应用在连接数据源的时候都可以在不暴露密码明文的情况下进行连接。
出现这个是因为你的数据库没有连接上导致的,检查以下几个地方
1.你的db.properties文件是否配置正确 useUnicode=true&&characterEncoding=UTF-8表示你设置的编码为utf-8保证与数据库的一致 防止乱码
jdbc.driverClass=com.mysql.jdbc.Driverjdbc.jdbcUrl=jdbc:mysql://localhost:3306/oa?unicode=true&characterEncoding=utf-8
jdbc.user=root
jdbc.password=111
2.检查你的spring/applicationContext-dao.xml是否配置了数据源,而且是否配置正确
<!--加载properties配置文件-->
<context:property-placeholder location="classpath:properties/dbinfo.properties"></context:property-placeholder>
3.你的连接名是否是正确的和你在db.properties中配置的是否一样
<!--加载properties配置文件--><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
4.你电脑中的服务是否打开
5.检查下的你数据库名是否存在,或者表是否存在
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)