1. 程式人生 > >JNDI連線資料庫加密使用者名稱密碼

JNDI連線資料庫加密使用者名稱密碼

一共包含了三件事: 
1.JNDI配置資料來源; 
2.加密JNDI配置的使用者名稱密碼; 
3.Spring配置JNDI; 

1. JNDI配置資料來源 
運用JNDI技術會把資料來源的配置資訊從專案裡分離出來新增到tomcat的context.xml(也可以是server.xml,只是server.xml修改後要重啟tomcat)以降低和專案的耦合度,如果配置資訊需要修改就不用重新部署專案了。具體做法如下: 
    在tomcat的context.xml檔案中的<Context>標籤中新增配置資訊,如下: 
<Resource name="jdbc/mybatis"   
             auth="Container"   
             type="javax.sql.DataSource"   
factory=" EncryptionBasicDataSourceFactory" 
             driverClassName="com.mysql.jdbc.Driver"   
             url="jdbc:mysql://localhost:3306/hccgyb"   
             username="127%136%134%150%136%121%"   
             password="127%136%134%150%136%121%"   
             maxActive="20"   
             maxIdle="10"   
             maxWait="10000"/> 
這裡說一下name屬性,這是資料來源的名字,程式載入資料來源就是按這個名字來找的,如果想深入瞭解,可以去網上了解一下lookup()這個方法(搜尋java lookup)。另外同樣用綠色標識出來的factory屬性是為後面要做的加解密做的必要工作,如果不加密就可以刪掉這個屬性,它的具體配置會在加密使用者名稱密碼那一節說。 

2. 加密JNDI配置的使用者名稱密碼 
加密使用者名稱密碼是在網上拷了一段加密的程式碼,然後跑加密程式把要加密的明文變成密文複製到上面的配置資訊中。這裡重點要說的是解密的工作: 
首先,要拿到配置檔案中的使用者名稱和密碼。Tomcat啟動載入context.xml檔案時會通過BasicDataSourceFactory(org.apache.tomcat.dbcp.dbcp. BasicDataSourceFactory,網上說要用tomcat安裝目錄下lib中的commons-dbcp-1.2.2.jar包裡的BasicDataSourceFactory類,對比之後發現這兩個包下的BasicDataSourceFactory類功能是一樣的,只是其中匯入的包稍有不同,可能是由於tomcat的版本不同吧!)這個類拿到資料來源配置資訊來給資料來源各個屬性賦值,那麼就可以通過繼承這個類並修改其中給資料來源賦值的程式碼部分來實現解密的工作。由於BasicDataSourceFactory類裡大量的屬性方法都private的,所以重新建一個和它一樣的類(名字自己起 EncryptionBasicDataSourceFactory)而不是繼承。 
其次,把解密的方法新增到 EncryptionBasicDataSourceFactory這個類(新建一個java工程來建立這個類)。找到給使用者名稱密碼賦值的那段程式碼,呼叫解密方法,儲存,將工程打成jar包,放到tomcat的lib目錄下。另外, EncryptionBasicDataSourceFactory拷的是哪個jar包裡BasicDataSourceFactory的內容,就要把哪個jar放到tomcat的lib目錄下。程式碼片段如下: 
if (value != null) 
dataSource.setTestWhileIdle(Boolean.valueOf(value).booleanValue()); 
value = decrypt
(properties.getProperty("password")); if (value != null) 
dataSource.setPassword(value); 
value = properties.getProperty("url"); 
if (value != null) 
dataSource.setUrl(value); 
value = decrypt(properties.getProperty("username")); if (value != null) 
dataSource.setUsername(value); 
value = properties.getProperty("validationQuery"); 
綠色標識出的decrypt
()是加入的解密方法,和之前的加密方法是對應的! 
    最後,該說說配置資訊中的factory屬性了。這個屬性就是用來指定tomcat配置資料來源時所用的類了。注意,這裡要寫類的全名! 

3.Spring配置JNDI 
在spring中配置了JNDI後,JNDI就是交由spring管理的一個元件,就不用在web.xml中配置了。配置程式碼如下: 
<beanid="dataSource"class="org.springframework.jndi.JndiObjectFactoryBean"> 
  <property name="jndiName"> 
<value>java:comp/env/ jdbc/mybatis</value> 
  </property> 
</bean> 
這裡用綠色標出來的 jdbc/mybatis就是在tomcat的context.xml中配置的資料來源的名字。 
現在三件工作就做完了,其中用到的打jar包,反編譯之類的網上資料是很多的,這裡就不重複了。 如果想把要求做的更高一點,可以用到混淆加密