问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

数据库密码里特殊字符@,配连接池怎样处理

发布网友 发布时间:2022-04-25 10:07

我来回答

1个回答

热心网友 时间:2022-04-13 22:34

问题解决思路:
将配置文件用户相关的信息(例如:密码)进行加密使其以密文形式存在,进行初始化连接池的时候进行解密操作,达到成功创建连接池的目的。Tomcat默认使用DBCP连接池(基于common-pool的一种连接池实现),可在http://jakarta.apache.org/commons/dbcp/下载commons-dbcp源码包commons-dbcp-1.4-src.zip,对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=0;i<psd.length;i++){
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 = 0; i < length; i++) {
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下部署的应用在连接数据源的时候都可以在不暴露密码明文的情况下进行连接。追问谢谢!我的是wabsphere6.1怎么做

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
手机导航地图语音怎么下载 如何分别真金和仿金首饰 怎样区分真金和仿金首饰呢 小学生新年晚会主持人的串词!!(不要太多)急 大大后天就需要了!!!_百度... 周年晚会策划公司 奥格瑞玛传送门大厅在哪 奥格瑞玛传送门大厅怎么走 锻炼颈椎的几个动作 水多久能结冰 冰能在多长时间内形成 请问水低于0度会结冰吗? 如何防止脱发严重 c#对数据库的插入,是每插一条数据就连接关闭一次吗,听别人说是要这么做,但不知道其好处是什么? 如何在NetBeans中设置数据库连接池 怎么使用mongoDB c++驱动的连接池 数据库连接池 的心跳是怎么实现 java中建立数据库连接池,有哪几个步骤 数据库连接池需要用到锁吗 c++ 如何实现连接池 如何解决c3p0数据库连接池死锁问题 电脑小白,买了一个据说是千兆端口的全千兆路由器,怎么鉴别是否真的是千兆? 千兆路由器是不是假的 易基积极成长2007年9月4日每份基金指数 如何辨别市面上的真伪千兆路由器? 嘉实300. 易方达积极成长,基金那个好。 易方达积极成长基金现在能够买吗? 怎样注册邮箱?在新浪微博里找到了,就是不知道怎样填写,比如,登陆名是怎样填写的? 登录新浪微博 ,注册邮箱号,怎么注册啊?邮箱号是什么?可否给一个范本_百... 如何辨别自己买的路由器是假千兆? 易方达积极成长基金净值多钱一份 易方达积极成长和易基成长是一回事么? 怎么看路由器是不是千兆路由 tomcat数据库连接池配制---连接sqlserver 铺完地砖以后,怎么检查铺的地砖是不是空的呢? 我对三层架构的数据库连接池的几点疑惑,求解! 地砖贴完多久可以检查空鼓 数据连接池中,context.xml中有哪些常用属性,各属性如何解释 地砖铺贴后如何确定是否有空鼓? c语言epool怎么和线程池一起使用 地砖铺贴完后过多久可以在上面走,什么时候检查空鼓? C有没有方便操作数据库的好工具,或者类库,或者头文件? 瓷地砖铺好几天验收? celipse中网页怎么与数据库连接 用pro*c/c++ 和qt creator工具让C++连接Oracle数据库的问题。 地面没浇水铺的地砖多久会出现空鼓 java 因为数据库反复的连接是很耗资源的,所以用连接池比较好 tomcat 7,mysql,intelliJ IDEA,jsp ...实现数据库连接池的问题 装修的时候该怎么看瓷砖铺的好不好? TOMCAT怎么配置连接池? 房间铺完了地砖多久可以入住? 刚铺好的地砖,发现有几块中间是空的,谁有好方法处理 如何贴地砖不空及地砖空鼓怎么办