Spring项目中修改javamelody映射url以及其它参数失效的问题

简介: 首先,servlet3.0支持模块化,在jar包中如果有web-fragmenet.xml,则servlet容器会先加载web.xml里的listener、filter和servlet,再加载web-fragment.xml里的组件。关于模块化的介绍:

首先,servlet3.0支持模块化,在jar包中如果有web-fragmenet.xml,则servlet容器会先加载web.xml里的listener、filter和servlet,再加载web-fragment.xml里的组件。关于模块化的介绍:


https://blog.csdn.net/chunxiaqiudong5/article/details/52840088

8.png

在javamelody-core中的META-INF目录下有一个web-fragment.xml文件,内容如下:

从上面文件中可以看出,当servlet容器启动时,会注册javamelody中定义的MonitoringFilter和SessionListener,MonitoringFilter默认的映射url为/monitoring。


此时我们想修改映射地址或者指定用户才能登录,有人在web.xml也配置了一个MonitoringFilter,如下:

10.png启动servlet容器后,输入localhost:8080/xxx/admin,出现404,然后再输入localhost:8080/xxx/monitoring,发现javamelody的监控页面出来了。


为什么自己定义的/admin没有起作用,文章开头已经说了,servlet容器会先加载web.xml,然后是web-fragment.xml,但是这个又和加载顺序有什么关系了,难道说后加载的会覆盖先加载的配置吗,答案是yes。


点开MonitoringFilter源码,看下面一段代码:

11.png

在doFilter这个方面里,有一个getMonitoringUrl()的方法,这个方法是用来获取init-param中的配置的monitoring-path中的参数值,也就是映射url。如果请求地址和配置的monitoring-path路径一致,则会看到监控页面。刚才输入/admin无效,说明getMonitoringUrl()返回的并不是/admin,点进这个方法:


12.png

这里可以看出,paramterValue应该是我们配置的url,是从Parameters.getParameter()中获取的,Parameter是一个枚举,点进Parameters.getParameter()方法:

13.png

我们配置的url是从FilterConfig实例中取出来的,而FilterConfig是从哪里来的呢,在Filter实现类里重写了init(FilterConfig config)方法。

14.png


在这里,FilterConfig被注入,点进这个方法,

15.png

filterConfig为类变量,如果我们在web.xml里配置了MonitoringFilter,首先执行该MonitoringFIlter实例的init方法,然后再执行web-fragment.xml中MonitoringFilter实例的init()方法,所以Prameters类中的类变量FilterConfig总是后面web-fragment.xml配置的MonitoringFilter的FilterConfig。


解决办法:


在web.xml中定义一个MonitoringFilter,并将名字设为javamelody,与javamelody包中的一致。ServletContext不会加载同名的Filter,故web-fragment.xml中的MonitoringFilter不会添加,如下:

16.png


相关文章
|
13天前
|
Java Maven 开发工具
IDEA使用Spring Initializr流畅的创建springboot项目
IDEA使用Spring Initializr流畅的创建springboot项目
45 0
|
5天前
|
消息中间件 负载均衡 Java
最容易学会的springboot gralde spring cloud 多模块微服务项目
最容易学会的springboot gralde spring cloud 多模块微服务项目
|
9天前
|
Java 开发者 Spring
Spring项目中Ordered接口的应用:全局过滤器(GlobalFilter)的顺序控制
Spring项目中Ordered接口的应用:全局过滤器(GlobalFilter)的顺序控制
12 2
|
14天前
|
运维 Java 测试技术
Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求
Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求
18 3
|
18天前
|
安全 算法 Java
在Spring Boot项目中集成Jasypt(Java Simplified Encryption)
在Spring Boot项目中集成Jasypt(Java Simplified Encryption)
30 7
|
18天前
|
消息中间件 Java Kafka
集成Kafka到Spring Boot项目中的步骤和配置
集成Kafka到Spring Boot项目中的步骤和配置
51 7
|
14天前
|
运维 Java 关系型数据库
Spring运维之boot项目bean属性的绑定读取与校验
Spring运维之boot项目bean属性的绑定读取与校验
18 2
|
14天前
|
XML 运维 Java
Spring运维之boot项目打包jar和插件运行并且设置启动时临时属性和自定义配置文件
Spring运维之boot项目打包jar和插件运行并且设置启动时临时属性和自定义配置文件
18 1
|
16天前
|
XML 前端开发 Java
SpringBoot参数校验@Validated、@Valid(javax.validation)详解
SpringBoot参数校验@Validated、@Valid(javax.validation)
28 4
|
18天前
|
Java API Spring
集成EasyPoi(一个基于POI的Excel导入导出工具)到Spring Boot项目中
集成EasyPoi(一个基于POI的Excel导入导出工具)到Spring Boot项目中
62 1