需手动注册StatViewServlet并配置WebStatFilter和WallFilter,确保路径匹配、Filter顺序正确、依赖完整且生产环境兼容。

怎么配 StatViewServlet 让 Druid 监控页面跑起来
Druid 的监控后台不是默认开启的,得手动注册一个 StatViewServlet,否则访问 /druid 就是 404。Spring Boot 2.0+ 后不再自动注册这个 Servlet,必须显式配置。
常见错误是只加了依赖、配了数据源,但没注册 Servlet,结果以为“集成好了”,一试发现页面打不开。
- 在
application.yml里加基础配置:spring: datasource: druid: stat-view-servlet: enabled: true url-pattern: /druid/* login-username: admin login-password: admin - 但光这样不够 —— Spring Boot 不会自动扫描并注册
StatViewServlet,还得写 Java 配置类: - 新建一个
@Configuration类,用@Bean注册StatViewServlet,注意路径匹配要和url-pattern一致; - 如果用了 Spring Security,得放行
/druid/**路径,否则登录页都加载不了(常见卡点); - 别把
login-username和login-password硬编码在配置里,上线前务必改成环境变量或密钥管理方式。
WallFilter 开启 SQL 防火墙为什么没生效
开了 WallFilter 却照样能执行 DELETE FROM user WHERE 1=1 这类语句?大概率是没真正启用 Wall 规则,或者规则配置被绕过了。
Druid 的 SQL 防火墙不是开关一开就拦所有危险操作,它依赖两个条件:Filter 必须注册成功 + 对应数据库类型的规则文件被加载。
- 确保
druid-wall依赖已引入(Maven 中单独加com.alibaba.druid:druid-wall); - 在
application.yml中启用:spring: datasource: druid: wall: enabled: true config-file: classpath:wall-filter.properties -
config-file是可选的,但如果没指定,Druid 会按数据库类型加载默认规则(如mysql或oracle),此时必须保证spring.datasource.url中包含正确数据库标识(比如含mysql字样); - 若自定义规则文件,内容需为 key=value 形式,例如
selectWhereAlone=false,且文件编码必须是 UTF-8(BOM 会导致解析失败); - 注意:WallFilter 只拦截 JDBC 层的 SQL,MyBatis 动态 SQL 若拼接在 Java 里(非 XML/注解原始 SQL),可能逃逸检测。
监控页面进得去,但 SQL 列表为空或实时数据不更新
页面能登录,但看不到慢 SQL、SQL 统计图空白、连接池状态不动 —— 多半是 WebStatFilter 没配对,或者 Filter 顺序错了。
Druid 监控依赖两个 Filter 协同:一个统计 Web 请求(WebStatFilter),一个收集 JDBC 执行(StatFilter)。缺一不可,而且 WebStatFilter 必须在 Spring MVC Filter 链前面。
- 确认
WebStatFilter已注册,且url-pattern覆盖你的真实请求路径(比如/*,不是/druid/*); - 检查是否和其他 Filter(如 Shiro、JWT、Spring Security)冲突 —— 如果
WebStatFilter被放在它们后面,用户请求可能被提前拦截,导致统计不到; - 确认数据源配置中启用了
stat类型 Filter:spring: datasource: druid: filters: stat,wall(不能漏掉stat); - 某些场景下(如异步线程里执行 SQL),Druid 默认不追踪上下文,需要手动调用
DruidDataSource.setUseGlobalDataSourceStat(true)并确保单例共享。
为什么本地 OK,上生产后监控页面 404 或防火墙失效
最常忽略的是 profile 差异和 jar 包冲突。开发时用 spring-boot-devtools 或 IDE 启动,很多配置隐式生效;打包成 jar 后,classloader 行为变了,资源路径、Filter 加载时机全不同。
尤其要注意 druid-spring-boot-starter 版本与 Spring Boot 主版本的兼容性 —— 1.1.x 的 starter 不支持 Boot 2.4+ 的 ServletRegistrationBean 变更,容易导致 StatViewServlet 根本没注册。
- 检查打包后的
BOOT-INF/lib/下是否存在druid-*.jar和druid-wall-*.jar,避免 Maven 依赖传递被 exclude 掉; - 确认
application-prod.yml里没有覆盖掉druid.stat-view-servlet.enabled=true; - 生产环境若用了 Nginx,确认转发时没 strip 掉
/druid/路径(比如配置了rewrite ^/druid/(.*)$ /$1 break;就会导致 404); - 防火墙规则在生产库名/表名敏感时,建议先用
log-violation=true和throw-exception=false观察日志,而不是直接true,避免误杀业务 SQL。
Druid 的监控和防火墙不是“配完就稳”,它的行为高度依赖 Filter 注册时机、类加载路径、数据库 URL 解析逻辑 —— 这些地方稍有偏差,表面看着启动成功,实际关键能力已经掉线。










