SpringBoot整合Druid数据源页面访问报该页面无法正常运作
异常页面:请求访问页面成功但是该网页无法正常运行
正常的页面:
输入:账号admin 密码:123456 进入
我的代码
pom.xml引入第三方Druid依赖
com.alibaba
druid
1.2.8
log4j
log4j
1.2.17
application.yml 文件
spring:
datasource:
username: root
password: 123456
# 如果时区报错了就添加 serverTimezone=UTC
url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
# driver-class-name: com.mysql.jdbc.Driver 可以自定义,目前最新版用的是com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
# springboot 默认是不注入这些属性值的,需要自己绑定
#Druid 数据源专有配置
# 初始化大小,最小,最大
initialSize: 5
minIdle: 5
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
#validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
#配置监控统计拦截的 filters ,stat:监控统计,log4j :日志统计,wall:防御 sql 注入
#如果允许时报错, Java.lang.ClassNotFoundException: org.apache.log4j.Priority
#则导入log4j依赖即可,maven地址:https://mvnrepository.com/artifact/log4j/log4j
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,slf4j
maxPoolPreparedStatementPerConnectionSize: 20
# 合并多个DruidDataSource的监控数据
useGlobalDataSourceStat: true
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
配置数据源DruidConfig.java
package com.hh.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
import java.util.HashMap;
@Configuration
public class DruidConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")//自动装配
public DataSource getDataSource(){
return new DruidDataSource();
}
// 后台监控 web.xml,ServletRegistrationBean
@Bean
public ServletRegistrationBean statViewServlet(){
/* ServletRegistrationBean bean = new ServletRegistrationBean<>(new StatViewServlet());*/
//---------出错的地方
ServletRegistrationBean bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
//后台需要有人登录,账号密码配置
HashMap initParameters=new HashMap<>();
// 增加配置 (登录的key 是固定的 loginUsername、loginPassword )
initParameters.put("loginUsername","admin");
initParameters.put("loginPassword","123456");
//允许谁可以访问 (key,value) value="":谁都可以访问;value="localhost":只有本机可以访问。多个ip逗号隔开
initParameters.put("allow","");
//禁止访 initParameters.put("hh","192.168.11.123");
//是否能够重置参数 initParameters.put("resetEnable","true");
//设置初始化参数
bean.setInitParameters(initParameters);
return bean;
}
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
Map initParameters=new HashMap<>();
//这些东西不进行统计
initParameters.put("exclusions","*.js,*.css,/druid/*");
bean.setInitParameters(initParameters);
return bean;
}
}
在看问题之前先了解一下Druid,Druid是阿里巴巴开源平台上的一个数据库连接池实现,结合了C3P0、DBCP、PROXOOL 等DB连接池的优点,同时加入了日志监控,druid可以很好的监控DB连接池和SQL的执行情况,天生就是针对监控而生的DB连接池。
我的异常问题是没有配置可行性路径,因为前面我在yml文件开启了filters拦截器,filter拦截掉了本身的东西,所以这里我就需要放行druid路径下的文件
ServletRegistrationBean bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
解决该问题我是参考了这篇文章
https://blog.csdn.net/qq_39669058/article/details/90440260
博主写得很好,推荐
还有另一写法就是在yml文件开启拦截器时就开启web监控放行/druid/* 路径,附上代码,仅供参考,请多指教
application.yml
spring:
datasource:
#类型
type: com.alibaba.druid.pool.DruidDataSource
#驱动
driverClassName: com.mysql.cj.jdbc.Driver
driver-class-name: com.mysql.cj.jdbc.Driver
#数据库连接
url: jdbc:mysql://localhost:3306/mybdtisdemo? useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=GMT%2b8&allowPublicKeyRetrieval=true
#数据库用户名密码
username: root
password: root
#连接池配置
druid:
#初始化连接池大小
initialSize: 10
#最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一 直减少到maxIdle为止
minIdle: 1
#最大活跃数
maxActive: 50
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制
maxWait: 60000
#失效检查线程运行时间间隔,要小于MySQL默认
timeBetweenEvictionRunsMillis: 60000
#连接的超时时间,默认为半小时
minEvictableIdleTimeMillis: 300000
#检查连接有效性的SQL语句
validationQuery: SELECT 1 FROM dual
#检查连接是否有效
testWhileIdle: true
testOnBorrow: true
testOnReturn: false
#开启池的prepared statement 池功能
poolPreparedStatements: false
#statement池能够同时分配的打开的statements的最大数量
maxOpenPreparedStatements: 50
#开启StatFilter
filter:
stat:
enabled: true
log-slow-sql: true
slow-sql-millis: 1000
#开启Slf4jFilter,使用logback时注释
#slf4j: #enabled: true
#data-source-log-enabled: false
#connection-log-enabled: false
#statement-log-enabled: false
#result-set-log-enabled: false
#开启WallFilter
wall:
enabled: true
log-violation: true
throw-exception: false
config:
delete-where-none-check: true
#开启Web监控
web-stat-filter:
enabled: true
exclusions: /druid/*,*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico url-pattern:/*
#开启监控页面
stat-view-servlet:
enabled: true
login-username: admin
login-password: admin