Druid监控页面打不开或空白,主因是Spring Boot未启用内置Servlet/Filter或被Security拦截;需引入druid-spring-boot-starter、显式开启web-stat-filter和stat-view-servlet,并放行/druid/**路径。

Druid监控页面打不开,stat过滤器没生效
常见现象是访问 /druid/index.html 返回 404,或页面加载后全是空白、无数据。根本原因通常是 Spring Boot 自动配置未启用 Druid 的内置监控 Servlet 和 Filter,或者路径被其他拦截器(如 Spring Security)挡住了。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 确认已引入
druid-spring-boot-starter(非原始druid),版本建议 >= 1.2.16,低版本对 Spring Boot 2.4+ 兼容差 - 在
application.yml中显式开启监控:spring: datasource: druid: web-stat-filter: enabled: true stat-view-servlet: enabled: true url-pattern: /druid/* - 若用 Spring Security,必须放行 Druid 路径:
http.authorizeHttpRequests().requestMatchers("/druid/**").permitAll();注意匹配顺序,别写在anyRequest().authenticated()后面 - 启动后检查日志是否输出
Registering servlet with name 'StatViewServlet',没有则说明配置未加载
SQL 防注入只靠 filter 配置不够
很多人以为加上 druid.filters=wall,stat 就万事大吉,结果还是能绕过执行恶意语句。WallFilter 默认策略偏宽松,比如不拦截注释中的子查询、允许部分函数调用,且对预编译参数(PreparedStatement)本身不干预——它只校验 SQL 文本拼接。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 启用 WallFilter 的严格模式:
spring.datasource.druid.wall.config.prepared-statement-check: true spring.datasource.druid.wall.config.multi-statement-allow: false spring.datasource.druid.wall.config.select-allow: false
(后者禁用所有SELECT,需按需调整) - 真正防注入的主战场不在 Druid,而在代码层:杜绝
String.format或+拼接 SQL;所有参数必须走?占位符,哪怕 MyBatis 也要用#{}而非${} - WallFilter 对存储过程、函数调用识别有限,若业务含大量
CALL或自定义函数,建议配合数据库侧权限控制(如限制用户仅能执行特定 routine)
maxActive 和 maxWait 在新版本里已失效
Spring Boot 2.0+ 默认使用 HikariCP,如果强行引入 Druid 并沿用老教程里的 maxActive、maxWait 参数,会静默忽略——这些是 Druid 1.0 时代的配置名,新版本统一改用标准 JDBC 连接池属性。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 用新版命名:
max-active→max-active(保持小写短横线),但更推荐直接用 JPA 标准名:maximum-pool-size(对应maxActive)、connection-timeout(对应maxWait) - 注意单位:Druid 的
maxWait单位是毫秒,而connection-timeout也是毫秒,但 Hikari 是毫秒,DBCP2 是毫秒,别混用旧文档的“秒”单位 - 连接泄漏检测要配两处:
remove-abandoned-on-borrow: true+remove-abandoned-timeout: 60(单位秒),否则空闲连接长期不归还会占满池子
监控页面看到大量 Connection is closed 报错
这不是 Druid 监控自身的问题,而是应用层没正确释放连接。典型场景是手动 getConnection() 后忘了 close(),或事务异常时未触发回滚与清理,导致连接被标记为“疑似泄露”,Druid 主动关闭并记日志。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 永远用 try-with-resources 包裹
Connection/Statement/ResultSet,别信“框架会帮我关” - 检查是否有 DAO 层直连 JDBC,绕过了 Spring 的
JdbcTemplate或事务管理器;这类代码最容易漏close - 在 Druid 配置中打开泄露检测:
spring.datasource.druid.remove-abandoned-on-borrow: true spring.datasource.druid.log-abandoned: true
,出问题时日志会打出哪行代码拿的连接没还










