A-A+

配置cndi数据源以及数据库密码加密

2015年12月29日 电脑网络 暂无评论 阅读 3 views 次

闲来无事觉得以前用过的一些东西过一段时间会忘记,所以开始想着发博文,第一次发博文,如有问题大家请多多指正。

1,首先在application.xml里面配置数据源

  1. <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">  
  2.      <property name="jndiName">  
  3.           <value>java:comp/env/jdbc/userDataSource</value>  
  4.      </property>  
  5.  </bean>  

2,配置web.xml,刚开始配置的时候,由于没有配置web.xml导致一直连接不上,后面查了一些资料才发现web.xml也需要配置。

  1. <resource-ref>  
  2.    <description>my DB Connection</description>  
  3.    <res-ref-name>jdbc/userDataSource</res-ref-name>  
  4.    <res-type>javax.sql.DataSource</res-type>  
  5.    <res-auth>Container</res-auth>  
  6. </resource-ref>  

3,打开tomcat目录下的conf,找到context.xml在里面配置数据库连接

  1. <Resource name="jdbc/userDataSource"     
  2.            auth="Container"  
  3.            type="javax.sql.DataSource"                    
  4.            driverClassName="com.mysql.jdbc.Driver"     
  5.            url="jdbc:mysql://ip/myDataDaseName"     
  6.            username="root"  
  7.            password="password"  
  8.            maxIdle="40"      
  9.            maxWait="4000"   
  10.            maxActive="250"   
  11.            removeAbandoned="true"  
  12.            removeAbandonedTimeout="180"  
  13.            logAbandoned="true"  
  14.            factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" />    

现在jndi应该是可以连接数据库了。

注意:如果修改了context里面的数据库连接,导致启动项目连接的还是以前的数据库地址请把eclipse里面Servers下面的tomcat删除掉,然后重新加入就OK了。

以上只是简单的用jndi连接数据库。

现在说一下怎么把数据库密码进行加密。其实很简单,tomcat里面的这个数据库连接配置最后还是指向

org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory

这个连接,反编译一看,发现就是在这个里面获取用户名密码以及其他参数的,所以我们在这里面动下手脚就OK了。源码:

  1. value = properties.getProperty("password");  
  2.     if (value != null) {  
  3.       dataSource.setPassword(value);  
  4.     }  
  5.    
  6.     value = properties.getProperty("url");  
  7.     if (value != null) {  
  8.       dataSource.setUrl(value);  
  9.     }  
  10.    
  11.     value = properties.getProperty("username");  
  12.     if (value != null) {  
  13.       dataSource.setUsername(value);  
  14.     }  

我是把这个BasicDataSourceFactory文件复制改名重写了一遍,改后的代码。

  1. value = properties.getProperty("password");  
  2.    if (value != null) {  
  3.      dataSource.setPassword(decode(value)); //解密操作  
  4.  }  
  5.  //自定义的解密方法,里面引用了AESEncrypt数字签名加密文件,config.properties里面配置了key钥  
  6. private static String decode(String password) throws Exception {  
  7.    byte[] bas = AESEncrypt.parseHexStr2Byte(password);  
  8.    InputStream is = new FileInputStream("/opt/config/config.properties");  
  9.    Properties prop = new Properties();  
  10.   
  11.    prop.load(is);  
  12.    String key = prop.getProperty("key");  
  13.    is.close();  
  14.    byte[] decr = AESEncrypt.decrypt(bas, key);  
  15.    return new String(decr);  
  16.  }  

然后factory连接指向这个新建的文件就行了

  1. factory="org.apache.tomcat.dbcp.dbcp.DecodeBasicDataSourceFactory"  

重写写一个类,是文件方便切换,如果不要加密直接指向BasicDataSourceFactory就行了。

标签:

给我留言