如何实现Tomcat连接池数据库密码加密

如何实现Tomcat连接池数据库密码加密,第1张

问题解决思路:

将配置文件用户相关的信息(例如:密码)进行加密使其以密文形式存在,进行初始化连接池的时候进行解密 *** 作,达到成功创建连接池的目的。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下部署的应用在连接数据源的时候都可以在不暴露密码明文的情况下进行连接。

Tomcat数据源连接池的配置

@@@@@@首先在lib目录下安装驱动

一、首先利用tomcat的web管理配置数据源,有以下几项

1 Jndi name :数据源连接池命名

2 Data Source URL: jdbc:mysql://localhost/test mysql是数据库类型,test是数据库名字 localhost是表示用本地的数据库

3 JDBC Driver Class: 数据库驱动类 mysql使用org.gjt.mm.mysql.Driver

4 User name 是数据库的用户名 5 Password是数据库的密码

6 Max.Active Connections: 最大的活动连接数

6 Max.ldle Connections:最大的空闲连接数

7 Max.Wait for Connection: 最大的等待连接数

以上配置完毕点击Save--Commit Changes--Log out

二、在tomcat安装目录下/conf/web.xml中添加如下信息

<resource-ref>

<description>DB Connection</description>

<res-ref-name>jdbc/mysql</res-ref-name> //要使用的数据源的名字

<res-type>javax.sql.DataSource</res-type> //数据源的类型

<res-auth>Container</res-auth> //和一中的一致

</resource-ref>

三、在tomcat安装目录下/conf/catalina/localhost目录下找到当前项目的配置信息(项目名.xml),添加

<ResourceLink name="jdbc/mysql" global="jdbc/mysql" type="javax.sql.DataSource"/>

以上完成了连接池的配置

第二种就是

1 把第一种步骤1里产生的代码放入tomcat安装目录下/conf/catalina/localhost/项目名.xml中

产生代码如下:

<Resource auth="Container" description="User database that can be updated and saved" name="UserDatabase" type="org.apache.catalina.UserDatabase"/>

<Resource name="jdbc/mysql" type="javax.sql.DataSource"/>

<ResourceParams name="UserDatabase">

<parameter>

<name>factory</name>

<value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>

</parameter>

<parameter>

<name>pathname</name>

<value>conf/tomcat-users.xml</value>

</parameter>

</ResourceParams>

<ResourceParams name="jdbc/mysql">

<parameter>

<name>url</name>

<value>jdbc:mysql://localhost/test</value>

</parameter>

<parameter>

<name>password</name>

<value></value>

</parameter>

<parameter>

<name>maxActive</name>

<value>4</value>

</parameter>

<parameter>

<name>maxWait</name>

<value>5000</value>

</parameter>

<parameter>

<name>driverClassName</name>

<value>org.gjt.mm.mysql.Driver</value>

</parameter>

<parameter>

<name>username</name>

<value>root</value>

</parameter>

<parameter>

<name>maxIdle</name>

<value>2</value>

</parameter>

</ResourceParams>

2 在tomcat安装目录下/conf/web.xml中添加如下信息

<resource-ref>

<description>DB Connection</description>

<res-ref-name>jdbc/mysql</res-ref-name> //要使用的数据源的名字

<res-type>javax.sql.DataSource</res-type> //数据源的类型

<res-auth>Container</res-auth>

</resource-ref>

两者的区别是作用域不同

数据库连接测试:

InitialContext ctx = new InitialContext()

ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql")

conn = ds.getConnection()

中文显示问题:

public static String toChinese(String strvalue) {

try{

if(strvalue==null)

{

return null

}

else {

strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK")

return strvalue

}

}catch(Exception e){

return null

}

}

一、Tomcat6.0中配置数据源

1.在Tomcat根目录/conf/Catalina/localhost目录下新建一个XML文件,文件名称跟工程名称一致.文件中的内容如下:

<?xml version='1.0' encoding='utf-8'?>

<Context docBase="E:\Eclipse3.4.2\workspace\mmis\WebContent" path="/mmis">

<Resource name="mmisds" type="javax.sql.DataSource"

factory="org.apache.commons.dbcp.BasicDataSourceFactory"

driverClassName="oracle.jdbc.driver.OracleDriver"

url="jdbc:oracle:thin:@192.168.2.250:1521:hmisb"

username="mtms" password="mtms"

validationQuery="select 1 from dual"

maxIdle="100" maxActive="500" maxWait="1000" defaultAutoCommit="true"

removeAbandoned="ture" removeAbandonedTimeout="60" logAbandoned="true"/>

</Context>

2.在tomcat的conf/context.xml中的<Context>标签中添加一个<Resource/>,内容如下:

<Resource name="jdbc/oa" auth="Container" type="javax.sql.DataSource"

factory="org.apache.commons.dbcp.BasicDataSourceFactory"

maxActive="100" maxIdle="500" maxWait="10000"

username="oa" password="oa" driverClassName="oracle.jdbc.driver.OracleDriver"

url="jdbc:oracle:thin:@172.16.60.30:1521:HMIS" defaultAutoCommit="true"

removeAbandoned="ture" removeAbandonedTimeout="60" logAbandoned="true" />

然后在web.xml<web-app>中添加引用(tomcat5.5以上可以不用添加这一段)

<resource-ref>

<description>DB Connection</description>

<res-ref-name>jdbc/oa</res-ref-name>

<res-type>javax.sql.DataSource</res-type>

<res-auth>Container</res-auth>

</resource-ref>

2.1.获取连接对象

public class ConnectionPool{

public static Connection getConn()throws Exception{

//初始化上下文

Context initContext=getInitContext()

Context envContext=(Context)initContext.lookup("java:/comp/env")

DataSource dataSource=(DataSource)envContext.lookup("jdbc/oa")

//获取连接对象

return ds.getConnection()

}

}

docBase是指Web工程所在的位置,path是工程的名称, name是指JNDI的名称,type是数据源的类型,driverClassName是驱动名称,url是驱动的连接字符串

username是指数据库的用户名,password是指数据库的密码,defaultAutoCommit是否自动提交


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6701591.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-27
下一篇 2023-03-27

发表评论

登录后才能评论

评论列表(0条)

保存