原因:Druid与Spring Boot的兼容性问题导致无法解密?
SpringBoot中数据库对应配置(具体加密自行百度)
spring:
# 数据源
datasource:
# 驱动类名
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
# 连接url
url: jdbc:mysql://ip:3306/db_name?useUnicode=true&characterEncoding=utf8
# 用户名
username: dev
# 密码
# java -cp .\druid-1.1.20.jar com.alibaba.druid.filter.config.ConfigTools 密码
password: eOH27epshlp3dkrhoMhKaEReFuiyTPEWkNuM4oo0bYAFdR00QrepdRmgeFQnGZJX+Z/Yr2B5AeCvOyNcVYhHHQ==
druid:
# 作用是告诉连接池初始化时应该初始化的物理连接数,要注意的是这个值越大,第一次调用数据库时越慢。
initial-size: 1
# 连接池中的最小空闲连接数,Druid会定时扫描连接池的连接,如果空闲的连接数大于该值,则关闭多余的连接,反之则创建更多的连接以满足最小连接数要求。
min-idle: 3
# 连接池的最大数据库连接数。设为0表示无限制。
max-active: 20
# 最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
max-wait: 60000
# 指定空闲连接检查、废弃连接清理、空闲连接池大小调整之间的操作时间间隔
time-between-eviction-runs-millis: 60000
# 指定一个空闲连接最少空闲多久后可被清除
min-evictable-idle-time-millis: 30000
# Druid用来测试连接是否可用的SQL语句,默认值每种数据库都不相同
# Mysql:SELECT 1;
# SQLSERVER:SELECT 1;
# ORACLE:SELECT 'x' FROM DUAL;
# PostGresql:SELECT 'x';
validation-query: SELECT 1;
# 如果为true(默认true),当应用向连接池申请连接,并且testOnBorrow为false时,连接池将会判断连接是否处于空闲状态,如果是,则验证这条连接是否可用。
test-while-idle: true
# 如果为true(默认为false),当应用向连接池申请连接时,连接池会判断这条连接是否是可用的。
test-on-borrow: false
# 如果为true(默认false),当应用使用完连接,连接池回收连接的时候会判断该连接是否还可用。
test-on-return: false
# 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。default=false
# 缓存游标:增删改查操作---如果开着可能会造成客户端占用内存,可能会因sql过大等造成服务端内存溢出
pool-prepared-statements: false
# 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,会存在Oracle下PSCache占用内存过多的问题,可以把这个数据配置大一些,比如100:default=-1:
max-pool-prepared-statement-per-connection-size: -1
# 属性类型是字符串,通过别名的方式配置扩展插件,
# 常用的插件有:
# 监控统计用的filter:stat
# 日志用的filter:log4j
# 防御sql注入的filter:wall
# 数据库加密filter:config
filters: stat,wall,slf4j,config
# config.decrypt.key={publicKey}
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=3000;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANR4Z7u0Tvzpb2Fx1WLp38diJtA6HaBdJp2vHWG8qD4gvOdrK4wexumSCc9VAXbg76ORPGoeX3FwAk2mQpuY7LkCAwEAAQ==
加密涉及到的配置有
????????password、filters、connection-properties
解决方案:添加?自定义DataSource配置文件解析类,初始化Druid的数据源
import java.sql.SQLException;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import com.alibaba.druid.pool.DruidDataSource;
/**
* 自定义DataSource配置文件解析类,初始化Druid的数据源
* 因为 Druid与Spring Boot的兼容性问题
* 正常可能无法进行密码解密
*/
@Configuration
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceConfig {
private Logger logger = LoggerFactory.getLogger(DataSourceConfig.class);
private String type;
private String url;
private String driverClassName;
private String username;
private String password;
private String filters;
private String connectionProperties;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFilters() {
return filters;
}
public void setFilters(String filters) {
this.filters = filters;
}
public String getConnectionProperties() {
return connectionProperties;
}
public void setConnectionProperties(String connectionProperties) {
this.connectionProperties = connectionProperties;
}
@Bean
@Primary
public DataSource druidDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setDriverClassName(driverClassName);
dataSource.setConnectionProperties(connectionProperties);
try {
dataSource.setFilters(filters);
} catch (SQLException e) {
logger.error("Druid初始化异常!", e);
}
logger.info("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Druid DataSource Init>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
return dataSource;
}
}
如果出现 Spring Boot Configuration Annotation 爆红
在pom文件中引用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
|