SpringBoot使用druid的密码加密

1.springboot默认连接池
习惯使用springboot的小伙伴通过开始学习springboot链接数据库时,都会尝试着官方文档来 学习,所以springboot默认支持的数据库连接池c3p0和 dhcp,大家应该都很熟悉了吧,只需要在.propeties文件中配置下数据库连接字符串即可,默认采用c3p0链接池进行连接数据库,但是今天我着重记录的并非官方默认支持的链接池,而是集成性能不错的阿里数据源druid。
2.阿里连接池druid介绍

Druid介绍

Druid是一个JDBC组件,druid 是阿里开源在 github 上面的数据库连接池,它包括三部分: 
* DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。 
* DruidDataSource 高效可管理的数据库连接池。 
* SQLParser 专门解析 sql 语句

Druid 有什么优点?
1. 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。 
2. 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。 
3. 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。 
4. SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。 
5. 扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter-Chain机制,很方便编写JDBC层的扩展插件

3.druid加解密浅析
首先我们来看下 druid加密的过程
通过命令:
java -cp druid-1.0.16.jar com.alibaba.druid.filter.config.ConfigTools you_password
   
   
返回值如下:publickey代表公钥,privatekey是密码加密后的结果

   
   
  1. privateKey:MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEA6+4avFnQKP+O7bu5YnxWoOZjv3no4aFV558HTPDoXs6EGD0HP7RzzhGPOKmpLQ1BbA5viSht+aDdaxXp6SvtMQIDAQABAkAeQt4fBo4SlCTrDUcMANLDtIlax/I87oqsONOg5M2JS0jNSbZuAXDv7/YEGEtMKuIESBZh7pvVG8FV531/fyOZAiEA+POkE+QwVbUfGyeugR6IGvnt4yeOwkC3bUoATScsN98CIQDynBXC8YngDNwZ62QPX+ONpqCel6g8NO9VKC+ETaS87wIhAKRouxZL38PqfqV/WlZ5ZGd0YS9gA360IK8zbOmHEkO/AiEAsES3iuvzQNYXFL3x9Tm2GzT1fkSx9wx+12BbJcVD7AECIQCD3Tv9S+AgRhQoNcuaSDNluVrL/B/wOmJRLqaOVJLQGg==
  2. publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOvuGrxZ0Cj/ju27uWJ8VqDmY7956OGhVeefB0zw6F7OhBg9Bz+0c84RjzipqS0NQWwOb4kobfmg3WsV6ekr7TECAwEAAQ==
通过加密时使用的命令我们不难看出druid对数据库密码加解密用的是configFilter这个类,所以在配置数据源链接时务必将该filter添加上,否则始终会抛出数据库连接异常,而druid是有重试机制的,默认重试30次,如果数据库做了限制频繁账号尝试连接的话,该账号有可能被锁定,导致线上数据库写入出现问题,所以缺了这样的配置实用加密连接还是蛮恐怖的,直接影响线上环境。
4.springboot使用druid(废话少说直接上代码)
首先加入依赖如下:针对该依赖配置信息(由于springboot未能全面支持druid 所以需要配置datasource)

   
   

    
    
  1. <dependency>
  2. <groupId>com.alibaba </groupId>
  3. <artifactId>druid </artifactId>
  4. <version>1.0.20 </version>
  5. </dependency>
 
  

   
   
  1. # 驱动配置信息
  2. spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
  3. spring.datasource.url = jdbc:mysql://127.0.0.1:3306/myspringboot
  4. spring.datasource.username = your account
  5. spring.datasource.password = your encryt password
  6. spring.datasource.driverClassName = com.mysql.jdbc.Driver
  7. # 连接池的配置信息
  8. # 初始化大小,最小,最大
  9. spring.datasource.initialSize=5
  10. spring.datasource.minIdle=5
  11. spring.datasource.maxActive=20
  12. # 配置获取连接等待超时的时间
  13. spring.datasource.maxWait=60000
  14. # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
  15. spring.datasource.timeBetweenEvictionRunsMillis=60000
  16. # 配置一个连接在池中最小生存的时间,单位是毫秒
  17. spring.datasource.minEvictableIdleTimeMillis=300000
  18. spring.datasource.validationQuery=SELECT 1 FROM DUAL
  19. spring.datasource.testWhileIdle=true
  20. spring.datasource.testOnBorrow=false
  21. spring.datasource.testOnReturn=false
  22. # 打开PSCache,并且指定每个连接上PSCache的大小
  23. spring.datasource.poolPreparedStatements=true
  24. spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
  25. # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
  26. spring.datasource.filters=config,stat,wall,log4j
  27. # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
  28. spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;config.decrpt=true;config.decrypt.key=your public key

   
   

   
   
  1. /**
  2. * Created by wk on 2018/1/10.
  3. */
  4. @Configuration
  5. @ConfigurationProperties(prefix= "spring.datasources")
  6. public class DataSourceConfig {
  7. private Logger logger = LoggerFactory. getLogger(DataSourceConfig. class);
  8. private String type;
  9. private String url;
  10. private String driverClassName;
  11. private String username;
  12. private String password;
  13. private Integer initialSize;
  14. private Integer minIdle;
  15. private Integer maxActive;
  16. private Integer maxWait;
  17. private Integer timeBetweenEvictionRunsMillis;
  18. private Integer minEvictableIdleTimeMillis;
  19. private String validationQuery;
  20. private Boolean testWhileIdle;
  21. private Boolean testOnBorrow;
  22. private Boolean testOnReturn;
  23. private Boolean poolPreparedStatements;
  24. private Integer maxPoolPreparedStatementPerConnectionSize;
  25. private String filters;
  26. private String connectionProperties;
  27. public String getDriverClassName() {
  28. return driverClassName;
  29. }
  30. public void setDriverClassName(String driverClassName) {
  31. this. driverClassName = driverClassName;
  32. }
  33. public String getType() {
  34. return type;
  35. }
  36. public void setType(String type) {
  37. this. type = type;
  38. }
  39. public String getUrl() {
  40. return url;
  41. }
  42. public void setUrl(String url) {
  43. this. url = url;
  44. }
  45. public String getUsername() {
  46. return username;
  47. }
  48. public void setUsername(String username) {
  49. this. username = username;
  50. }
  51. public String getPassword() {
  52. return password;
  53. }
  54. public void setPassword(String password) {
  55. this. password = password;
  56. }
  57. public Integer getInitialSize() {
  58. return initialSize;
  59. }
  60. public void setInitialSize(Integer initialSize) {
  61. this. initialSize = initialSize;
  62. }
  63. public Integer getMinIdle() {
  64. return minIdle;
  65. }
  66. public void setMinIdle(Integer minIdle) {
  67. this. minIdle = minIdle;
  68. }
  69. public Integer getMaxActive() {
  70. return maxActive;
  71. }
  72. public void setMaxActive(Integer maxActive) {
  73. this. maxActive = maxActive;
  74. }
  75. public Integer getMaxWait() {
  76. return maxWait;
  77. }
  78. public void setMaxWait(Integer maxWait) {
  79. this. maxWait = maxWait;
  80. }
  81. public Integer getTimeBetweenEvictionRunsMillis() {
  82. return timeBetweenEvictionRunsMillis;
  83. }
  84. public void setTimeBetweenEvictionRunsMillis(Integer timeBetweenEvictionRunsMillis) {
  85. this. timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
  86. }
  87. public Integer getMinEvictableIdleTimeMillis() {
  88. return minEvictableIdleTimeMillis;
  89. }
  90. public void setMinEvictableIdleTimeMillis(Integer minEvictableIdleTimeMillis) {
  91. this. minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
  92. }
  93. public String getValidationQuery() {
  94. return validationQuery;
  95. }
  96. public void setValidationQuery(String validationQuery) {
  97. this. validationQuery = validationQuery;
  98. }
  99. public Boolean getTestWhileIdle() {
  100. return testWhileIdle;
  101. }
  102. public void setTestWhileIdle(Boolean testWhileIdle) {
  103. this. testWhileIdle = testWhileIdle;
  104. }
  105. public Boolean getTestOnBorrow() {
  106. return testOnBorrow;
  107. }
  108. public void setTestOnBorrow(Boolean testOnBorrow) {
  109. this. testOnBorrow = testOnBorrow;
  110. }
  111. public Boolean getTestOnReturn() {
  112. return testOnReturn;
  113. }
  114. public void setTestOnReturn(Boolean testOnReturn) {
  115. this. testOnReturn = testOnReturn;
  116. }
  117. public Boolean getPoolPreparedStatements() {
  118. return poolPreparedStatements;
  119. }
  120. public void setPoolPreparedStatements(Boolean poolPreparedStatements) {
  121. this. poolPreparedStatements = poolPreparedStatements;
  122. }
  123. public Integer getMaxPoolPreparedStatementPerConnectionSize() {
  124. return maxPoolPreparedStatementPerConnectionSize;
  125. }
  126. public void setMaxPoolPreparedStatementPerConnectionSize(Integer maxPoolPreparedStatementPerConnectionSize) {
  127. this. maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;
  128. }
  129. public String getFilters() {
  130. return filters;
  131. }
  132. public void setFilters(String filters) {
  133. this. filters = filters;
  134. }
  135. public String getConnectionProperties() {
  136. return connectionProperties;
  137. }
  138. public void setConnectionProperties(String connectionProperties) {
  139. this. connectionProperties = connectionProperties;
  140. }
  141. @Bean
  142. public ServletRegistrationBean druidServlet() {
  143. ServletRegistrationBean reg = new ServletRegistrationBean();
  144. reg.setServlet( new StatViewServlet());
  145. reg.addUrlMappings( "/druid/*");
  146. reg.addInitParameter( "loginUsername", username);
  147. reg.addInitParameter( "loginPassword", password);
  148. return reg;
  149. }
  150. @Bean
  151. public FilterRegistrationBean filterRegistrationBean() {
  152. FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
  153. filterRegistrationBean.setFilter( new WebStatFilter());
  154. filterRegistrationBean.addUrlPatterns( "/*");
  155. filterRegistrationBean.addInitParameter( "exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
  156. filterRegistrationBean.addInitParameter( "profileEnable", "true");
  157. return filterRegistrationBean;
  158. }
  159. @Bean
  160. @Primary
  161. public DataSource druidDataSource() {
  162. DruidDataSource datasource = new DruidDataSource();
  163. datasource.setUrl( url);
  164. datasource.setUsername( username);
  165. datasource.setPassword( password);
  166. datasource.setDriverClassName( driverClassName);
  167. datasource.setInitialSize( initialSize);
  168. datasource.setMinIdle( minIdle);
  169. datasource.setMaxActive( maxActive);
  170. datasource.setMaxWait( maxWait);
  171. datasource.setTimeBetweenEvictionRunsMillis( timeBetweenEvictionRunsMillis);
  172. datasource.setMinEvictableIdleTimeMillis( minEvictableIdleTimeMillis);
  173. datasource.setValidationQuery( validationQuery);
  174. datasource.setTestWhileIdle( testWhileIdle);
  175. datasource.setTestOnBorrow( testOnBorrow);
  176. datasource.setTestOnReturn( testOnReturn);
  177. String paramArray[] = connectionProperties.split( ";");
  178. datasource.setConnectionProperties( connectionProperties);
  179. try {
  180. datasource.setFilters( filters);
  181. } catch (SQLException e) {
  182. logger.error( "druid configuration initialization filter", e);
  183. }
  184. return datasource;
  185. }
  186. }
2.或者直接用druid-spring-boot-starter druid-spring-boot-starter项目

   
   

    
    
  1. <dependency>
  2. <groupId>com.alibaba </groupId>
  3. <artifactId>druid-spring-boot-starter </artifactId>
  4. <version>1.1.0 </version>
  5. </dependency>
 
  
######Druid数据源配置######
 # JDBC配置
 spring.datasource.druid.url= # 或spring.datasource.url=
 spring.datasource.druid.username= # 或spring.datasource.username=
 spring.datasource.druid.password= # 或spring.datasource.password=
 spring.datasource.druid.driver-class-name= #或 spring.datasource.driver-class-name=
  
 # 连接池配置,下面配置说明请参考Druid Github Wiki,配置_DruidDataSource参考配置
 spring.datasource.druid.initial-size=
 spring.datasource.druid.max-active=
 spring.datasource.druid.min-idle=
 spring.datasource.druid.max-wait=
 spring.datasource.druid.pool-prepared-statements=
 spring.datasource.druid.max-pool-prepared-statement-per-connection-size=
 spring.datasource.druid.max-open-prepared-statements= #等价于上面的max-pool-prepared-statement-per-connection-size
 spring.datasource.druid.validation-query=
 spring.datasource.druid.validation-query-timeout=
 spring.datasource.druid.test-on-borrow=
 spring.datasource.druid.test-on-return=
 spring.datasource.druid.test-while-idle=
 spring.datasource.druid.time-between-eviction-runs-millis=
 spring.datasource.druid.min-evictable-idle-time-millis=
 spring.datasource.druid.max-evictable-idle-time-millis=
 spring.datasource.druid.filters= #默认值stat,配置多个英文逗号分隔
 ...
 # 更多配置属性见 DruidDataSource 内成员变量(只要有set方法便支持),或者根据IDE提示,或者查看官方文档
  
 ######Druid监控配置######
 #下面配置说明请参考Druid Github Wiki,配置_配置WebStatFilter
 spring.datasource.druid.web-stat-filter.enabled= #是否启用StatFilter默认值true
 spring.datasource.druid.web-stat-filter.url-pattern=
 spring.datasource.druid.web-stat-filter.exclusions=
 spring.datasource.druid.web-stat-filter.session-stat-enable=
 spring.datasource.druid.web-stat-filter.session-stat-max-count=
 spring.datasource.druid.web-stat-filter.principal-session-name=
 spring.datasource.druid.web-stat-filter.principal-cookie-name=
 spring.datasource.druid.web-stat-filter.profile-enable=
 #下面配置说明请参考Druid Github Wiki,配置_StatViewServlet配置
 spring.datasource.druid.stat-view-servlet.enabled= #是否启用StatViewServlet默认值true
 spring.datasource.druid.stat-view-servlet.url-pattern=
 spring.datasource.druid.stat-view-servlet.reset-enable=
 spring.datasource.druid.stat-view-servlet.login-username=
 spring.datasource.druid.stat-view-servlet.login-password=
 spring.datasource.druid.stat-view-servlet.allow=
 spring.datasource.druid.stat-view-servlet.deny=
 #下面配置说明请参考Druid Github Wiki,配置_Druid和Spring关联监控配置
 spring.datasource.druid.aop-patterns= #Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔
 #如果spring.datasource.druid.aop-patterns要代理的类没有定义interface请设置spring.aop.proxy-target-class=true








原文连接:https://blog.csdn.net/ikownyou/article/details/79022560

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值