SpringMVC使用隱式jdbc連接信息
來自: http://blog.csdn.net/qing_gee/article/details/50754383
本地測試環境中,我們如果使用SpringMVC構建項目時,數據庫的“用戶名、密碼、連接地址”都直接明文寫在配置文件中。而一旦項目構建在運行環境的服務器時,對“用戶名、密碼、連接地址”連接信息進行必要的隱藏,這樣更加安全一些,那么如何來做隱式jdbc連接信息呢?
一、隱式jdbc連接信息的可行方案
SpringMVC在構建jdbc連接信息時,一般是在“applicationContext.xml”文件中有如下信息提供給項目的JdbcConnection。
<!-- 引入jdbc配置文件 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <value>file:C:/properties/hcmanage.properties</value> </property> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${driver}"></property> <property name="url" value="${url}?useUnicode=true&characterEncoding=utf8&"></property> <property name="username" value="${username}"></property> <property name="password" value="${password}"></property> <property name="testOnBorrow" value="true" /> <property name="validationQuery"> <value>select 1 from DUAL</value> </property> </bean>
然后我們在hcmanage.properties文件中配置“用戶名、密碼、連接地址”的明文信息。
driver=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/jdbc username=root password=root
這種原始的做法很直接的就暴露了我們的“用戶名、密碼、連接地址”等關鍵信息,那么如何來規避這些關鍵信息呢?最好的做法是在hcmanage.properties文件中我們只提供如下信息顯示:
driver=com.mysql.jdbc.Driver url= username= password=
我們把“用戶名、密碼、連接地址”真實信息保存在相對安全的位置,比如說我們自己的數據庫,該數據庫不在生產環境上,這樣做的話,別人要想知道生產環境上的“用戶名、密碼、連接地址”,就必須先破解我們自己的服務器,然后破解該服務器上的數據庫,相對來說增加了不少難度。
那么想要實現這種安全的效果,我們該怎么做呢?
關鍵位置就在“ PropertyPlaceholderConfigurer ”類上!
<!-- 引入jdbc配置文件 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <value>file:C:/properties/hcmanage.properties</value> </property> </bean>
二、繼承PropertyPlaceholderConfigurer類
沒錯,我們新建一個自定義的PropertyPlaceholderConfigurer類,繼承”org.springframework.beans.factory.config.PropertyPlaceholderConfigurer”。
EncryptPropertyPlaceholderConfigurer.java
public class EncryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer { @Override protected String convertProperty(String propertyName, String propertyValue) { if (isEncryptProperty(propertyName)) { return Constants.databaseMap.get(propertyName); } return super.convertProperty(propertyName, propertyValue); } private boolean isEncryptProperty(String pname) { for (String name : Constants.DATABASE_PROPERTY_NAMES) { if (name.equals(pname)) { return true; } } return false; } }
ps:注意關鍵方法
protected String convertProperty(String propertyName, String propertyValue)
該方法會根據配置文件中提供的propertyName,按照我們自己的意愿進行轉換,返回對應的propertyValue。
也就是說,我們可以將
driver=com.mysql.jdbc.Driver url= username= password=
通過一定的轉換法則,轉換為
driver=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/jdbc username=root password=root
而這個過程是不透明的,也就是所謂的隱式轉換!
三、使用webservice進行jdbc連接信息的獲取
如何建立webservice通信連接,你可以參照第二篇。如何在通信過程中進行非對稱加密,你可以參照第一篇。
由于之前寫過類似博客,我這里就不再贅述,重要的是提供SpringMVC使用隱式jdbc連接信息的解決方案!
感謝您閱讀【沉默王二的博客】,如果王二的博客給您帶來一絲幫助或感動,我(也就是王二)將不甚榮幸。
如果您碰巧喜歡,可以留言或者私信我,這將是我鼓搗更多優秀文章的最強動力。