SpringBoot 5、Springboot 链接Druid ,配置数据库监控、数据库密码加密

Druid常识看这里Druid wiki ,中文wiki 和源码中文注释太友好啦

1 从maven仓库找到druid maven 地址 mvnrepository

<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
2 指定datasource

spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://10.10.8.27:3306/jdbc
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource

3 testDatasource报错

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type 'org.apache.tomcat.jdbc.pool.DataSource' available:
expected at least 1 bean which qualifies as autowire candidate.
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

仔细看才发现导错包了 晕。。

import javax.sql.DataSource; 导成
import org.apache.tomcat.jdbc.pool.DataSource;
4 配置DataSource properties

springboot 对druid许多配置不自动支持,需要配置自定义配置类,class add anotation @Configration

创建DruidDataSource 加入容器

@Configuration
public class DruidConfig {

@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource dataSource(){
return new DruidDataSource();
}
}

2 配置druid 监控:配置管理后台的Servlet和监控filter,在druid wiki 中例子是配置在web.xml,我们是在配置类DruidConfig编码实现,http://localhost:8080/druid/ 登录,查看监控信息

@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
Map<String,String> initMap = new HashMap<>();
initMap.put("loginUsername","admin");
initMap.put("loginPassword","123456");
initMap.put("allow","");
//initMap.put("deny","");
//initMap.put("remoteAddress","");
bean.setInitParameters(initMap);
return bean;
}

@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean();
//bean.setFilter(new WebStatFilter());
bean.setFilter(new WebStatFilter());

Map<String, String> initParams = new HashMap<>();
initParams.put("exclusions","*.js,*.css,/druid/*");
bean.setInitParameters(initParams);
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
3 使用ConfigFilter 数据库密码加密:

首先使用druid jar包的ConfigTools 生成公钥、私钥和密码

D:\RepMaven\com\alibaba\druid\1.1.8>java -cp druid-1.1.8.jar com.alibaba.druid.filter.config.ConfigTools 123456
privateKey:MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAoPyZ0cbZCrpU9JocMLYL3+aNxa/d/+4RzRyaC0N4lcxngLrzhnB/zWnFIs+H93b01I/QUKSj6p1mvZvdzZHuBQIDAQABAkEAkmIeXCm74Y1dAq2/RGvEkGtMLp2j97u6ZA/F4sgPNeWXM0ROJbTqvdcq4rMEdmQluzNXVoT4wWMtX9fOWcoyAQIhAPdCDj7ypzoS40Swmy+2rJ6yK5GxhwzatOm1hMIPmSNRAiEApq2zDqUGembDxmjMApHtpecsLluidMVZY7CsM0bRqnUCIQDVIg99m1Ui7h0RnNpoaqKpuRNtZwXuwqenvVxOm3t5wQIgOshdstd+fmKJvwqskGd4wZ7S1RKaK8aB7Qec44ShYxUCIAK75AKHddj/bU8nxOb+ri2xULzLwkWh0APvHJNucZTc
publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKD8mdHG2Qq6VPSaHDC2C9/mjcWv3f/uEc0cmgtDeJXMZ4C684Zwf81pxSLPh/d29NSP0FCko+qdZr2b3c2R7gUCAwEAAQ==
password:UH3YiRWSqXlwwxBQ6tL7smdS4I9CQksW+CrJsjRQmfNGHu2AXxLwjsN0rq//YPWaOEagFX6kWXZNVCFbVVyx/A==
其次 修改数据库配置,将原来的明文密码改为加密后的密码,spring.datasource.filters 增加config,connection properties启用加密,配置公钥

spring:
datasource:
username: root
# 生成的加密后的密码(原密码 123456)
password: UH3YiRWSqXlwwxBQ6tL7smdS4I9CQksW+CrJsjRQmfNGHu2AXxLwjsN0rq//YPWaOEagFX6kWXZNVCFbVVyx/A==
url: jdbc:mysql://10.10.8.255:3306/jdbc
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource

# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙,config启用ConfigFilter,可以用于加密和读取配置文件
filters: stat,wall,log4j,config
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
# 配置 connection-properties,启用加密,配置公钥。
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500;config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKD8mdHG2Qq6VPSaHDC2C9/mjcWv3f/uEc0cmgtDeJXMZ4C684Zwf81pxSLPh/d29NSP0FCko+qdZr2b3c2R7gUCAwEAAQ==
除了WIKI,这篇文章推荐学习
Druid连接池自定义数据库密码加解密的实现
来一段com.alibaba.druid.filter.config.ConfigTools 中解密方法乐一下^_^
public static String decrypt(PublicKey publicKey, String cipherText)
throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
try {
cipher.init(Cipher.DECRYPT_MODE, publicKey);
} catch (InvalidKeyException e) {
// 因为 IBM JDK 不支持私钥加密, 公钥解密, 所以要反转公私钥
// 也就是说对于解密, 可以通过公钥的参数伪造一个私钥对象欺骗 IBM JDK
RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey;
RSAPrivateKeySpec spec = new RSAPrivateKeySpec(rsaPublicKey.getModulus(), rsaPublicKey.getPublicExponent());
Key fakePrivateKey = KeyFactory.getInstance("RSA").generatePrivate(spec);
cipher = Cipher.getInstance("RSA"); //It is a stateful object. so we need to get new one.
cipher.init(Cipher.DECRYPT_MODE, fakePrivateKey);
}

if (cipherText == null || cipherText.length() == 0) {
return cipherText;
}

byte[] cipherBytes = Base64.base64ToByteArray(cipherText);
byte[] plainBytes = cipher.doFinal(cipherBytes);

return new String(plainBytes);
}


5. 怎么打开Druid的监控统计功能
Druid的监控统计功能是通过filter-chain扩展实现,如果你要打开监控统计功能,配置StatFilter,具体看这里:https://github.com/alibaba/druid/wiki/配置_StatFilter

Druid内置提供一个StatFilter,用于统计监控信息。

6. 怎样使用Druid的内置监控页面
内置监控页面是一个Servlet,具体配置看这里:https://github.com/alibaba/druid/wiki/配置_StatViewServlet配置

Druid内置提供了一个StatViewServlet用于展示Druid的统计信息。

<!-- 配置 Druid 监控信息显示页面 -->
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<init-param>
<!-- 允许清空统计数据 -->
<param-name>resetEnable</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!-- 用户名 -->
<param-name>loginUsername</param-name>
<param-value>druid</param-value>
</init-param>
<init-param>
<!-- 密码 -->
<param-name>loginPassword</param-name>
<param-value>druid</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
7. 内置监控中的Web和Spring关联监控怎么配置?
Web关联监控配置
https://github.com/alibaba/druid/wiki/配置_配置WebStatFilter
Spring关联监控配置
https://github.com/alibaba/druid/wiki/配置_Druid和Spring关联监控配置
<filter>
<filter-name>DruidWebStatFilter</filter-name>
<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
<init-param>
<param-name>exclusions</param-name>
<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>DruidWebStatFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
————————————————
版权声明:本文为CSDN博主「QIANQIANCHEN0」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/QIANQIANCHEN0/article/details/80906605

原文地址:https://www.cnblogs.com/javalinux/p/15662553.html