首页 > Java > 关于 druid 监控的两个小问题

关于 druid 监控的两个小问题

前一段时间做一个小需求,需要展示 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 而已。

全文完,如果本文对您有所帮助,请花 1 秒钟帮忙点击一下广告,谢谢。

作 者: BridgeLi,https://www.bridgeli.cn
原文链接:http://www.bridgeli.cn/archives/778
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
分类: Java 标签: ,
  1. 本文目前尚无任何评论.

请输入正确的验证码