前一段时间做一个小需求,需要展示 druid 的监控页面,我们都知道 druid 监控地址是:http://ip:port/druid/index.html,但是当时一直报 404,后来查了资料,引入的 jar 包:


<dependency>  
<groupId>com.alibaba</groupId>  
<artifactId>druid</artifactId>  
<version>1.2.24</version>  
</dependency>

应该是因为不是通过 starter 包引入的,所以需要手动配置:


package cn.bridgeli.demo;

import com.alibaba.druid.support.jakarta.StatViewServlet;  
import com.alibaba.druid.support.jakarta.WebStatFilter;  
import com.alibaba.druid.util.Utils;  
import jakarta.servlet.Filter;  
import jakarta.servlet.FilterChain;  
import jakarta.servlet.ServletException;  
import jakarta.servlet.ServletRequest;  
import jakarta.servlet.ServletResponse;  
import org.springframework.boot.web.servlet.FilterRegistrationBean;  
import org.springframework.boot.web.servlet.ServletRegistrationBean;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;

import java.io.IOException;

@Configuration  
public class DruidConfig {

@Bean  
public ServletRegistrationBean<StatViewServlet> statViewServlet() {  
ServletRegistrationBean<StatViewServlet> servletRegistrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");  
// 设置登录用户名和密码  
servletRegistrationBean.addInitParameter("loginUsername", "BridgeLi");  
servletRegistrationBean.addInitParameter("loginPassword", "BridgeLi");  
return servletRegistrationBean;  
}

@Bean  
public FilterRegistrationBean<WebStatFilter> webStatFilter() {  
FilterRegistrationBean<WebStatFilter> filterRegistrationBean = new FilterRegistrationBean<>(new WebStatFilter());  
filterRegistrationBean.addUrlPatterns("/*");  
filterRegistrationBean.addInitParameter("exclusions", "\*.js,\*.gif,\*.jpg,\*.png,\*.css,\*.ico,/druid/*");  
return filterRegistrationBean;  
}

}

另外一个小问题就是,这么引入之后,打开监控页最下面会有 alibaba 的广告,一般情况下,我们肯定是想去掉的,广告代码所在的位置在 support/http/resources/js/common.js 这个 js 里面,网上有人说直接解压删掉,重新打包就行了,但是这个有问题就是必须用重新打包的这个 jar,搜了一下资料,其实去掉也很简单,在上面的那个类里面增加一个 配置过滤掉即可:


@Bean  
public FilterRegistrationBean<Filter> removeDruidAdFilterRegistrationBean() {  
// 获取web监控页面的参数  
// 提取common.js的配置路径  
String pattern = "/druid/*";  
String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");  
final String filePath = "support/http/resources/js/common.js";  
// 创建filter进行过滤  
Filter filter = new Filter() {  
@Override  
public void init(jakarta.servlet.FilterConfig filterConfig) throws ServletException {  
}

@Override  
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)  
throws IOException, ServletException {  
chain.doFilter(request, response);  
// 重置缓冲区,响应头不会被重置  
response.resetBuffer();  
// 获取common.js  
String text = Utils.readFromResource(filePath);  
// 正则替换banner, 除去底部的广告信息  
text = text.replaceAll("<a.*?banner\"></a><br/>", "");  
text = text.replaceAll("powered.*?shrek.wang</a>", "");  
response.getWriter().write(text);  
}

@Override  
public void destroy() {  
}  
};  
FilterRegistrationBean<Filter> registrationBean = new FilterRegistrationBean<>();  
registrationBean.setFilter(filter);  
registrationBean.addUrlPatterns(commonJsPattern);  
return registrationBean;  
}

如果是引入的 starter 也可以把方法的声明改成下面这种:


@SuppressWarnings({"rawtypes", "unchecked"})  
@Bean  
@ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true")  
public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) {  
// 获取web监控页面的参数  
DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();  
// 提取common.js的配置路径  
String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";  
String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");  
final String filePath = "support/http/resources/js/common.js";  
// 创建filter进行过滤  
Filter filter = new Filter() {  
@Override  
public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {  
}

@Override  
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)  
throws IOException, ServletException {  
chain.doFilter(request, response);  
// 重置缓冲区,响应头不会被重置  
response.resetBuffer();  
// 获取common.js  
String text = Utils.readFromResource(filePath);  
// 正则替换banner, 除去底部的广告信息  
text = text.replaceAll("<a.*?banner\"></a><br/>", "");  
text = text.replaceAll("powered.*?shrek.wang</a>", "");  
response.getWriter().write(text);  
}

@Override  
public void destroy() {  
}  
};  
FilterRegistrationBean registrationBean = new FilterRegistrationBean();  
registrationBean.setFilter(filter);  
registrationBean.addUrlPatterns(commonJsPattern);  
return registrationBean;  
}

其实就是怎么拿到 common.js 而已。