省略factory参数时jconsole可明文查看Tomcat DataSource密码问题咨询
问题根因拆解
factory 参数的作用
Tomcat解析context.xml中<Resource>类型的数据源配置时,不会固定绑定某一种连接池实现,而是通过factory参数指定的工厂类,完成连接池实例的创建、配置参数注入、初始化全流程。
- 当你省略该参数时,Tomcat 8.x及以上版本会默认使用
org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory,也就是DBCP2连接池的工厂类,最终实例化的是DBCP2连接池对象。 - 当你显式配置
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"时,Tomcat才会切换为Tomcat JDBC Pool作为连接池实现,实例化对应的JDBC Pool数据源对象。
JMX密码展示差异的实现逻辑
两种场景的差异本质是两个连接池实现的JMX MBean设计逻辑不同:
- 省略
factory的DBCP2场景:DBCP2的BasicDataSourceMBean没有对password属性做权限控制或脱敏处理,JConsole通过JMX接口调用属性getter方法时,会直接拿到连接池内部存储的明文密码,因此可以直接查看。 - 显式配置
factory的Tomcat JDBC Pool场景:Tomcat JDBC Pool的数据源MBean在代码层面专门做了防护,当外部通过JMX接口调用getPassword()方法时,不会返回真实的密码值,直接返回固定提示字符串Password not available as DataSource/JMX operation.,从接口层面阻断了明文密码通过JMX泄露的路径。
注意:该逻辑仅为JMX接口层面的访问拦截,并不代表连接池本身对密码做了加密存储,连接池运行时内部仍然持有明文密码用于创建数据库连接。
内容的提问来源于stack exchange,提问作者Nanne
相关产品推荐
相关产品推荐

