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


相关文章
|
3天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
11 2
|
29天前
|
JSON 前端开发 Java
Spring MVC——获取参数和响应
本文介绍了如何在Spring框架中通过不同的注解和方法获取URL参数、上传文件、处理cookie和session、以及响应不同类型的数据。具体内容包括使用`@PathVariable`获取URL中的参数,使用`MultipartFile`上传文件,通过`HttpServletRequest`和`@CookieValue`获取cookie,通过`HttpSession`和`@SessionAttribute`获取session,以及如何返回静态页面、HTML代码片段、JSON数据,并设置HTTP状态码和响应头。
48 1
Spring MVC——获取参数和响应
|
29天前
|
设计模式 前端开发 Java
Spring MVC——项目创建和建立请求连接
MVC是一种软件架构设计模式,将应用分为模型、视图和控制器三部分。Spring MVC是基于MVC模式的Web框架,通过`@RequestMapping`等注解实现URL路由映射,支持GET和POST请求,并可传递参数。创建Spring MVC项目与Spring Boot类似,使用`@RestController`注解标记控制器类。
34 1
Spring MVC——项目创建和建立请求连接
|
29天前
|
Java 关系型数据库 MySQL
Maven——创建 Spring Boot项目
Maven 是一个项目管理工具,通过配置 `pom.xml` 文件自动获取所需的 jar 包,简化了项目的构建和管理过程。其核心功能包括项目构建和依赖管理,支持创建、编译、测试、打包和发布项目。Maven 仓库分为本地仓库和远程仓库,远程仓库包括中央仓库、私服和其他公共库。此外,文档还介绍了如何创建第一个 SpringBoot 项目并实现简单的 HTTP 请求响应。
113 1
Maven——创建 Spring Boot项目
|
1月前
|
Java 关系型数据库 MySQL
如何使用 maven 创建一个 Spring Boot项目
Maven 是一个强大的项目管理工具,通过配置 `pom.xml` 文件自动获取所需的 jar 包,提高开发效率。其核心功能包括项目构建和依赖管理。项目构建支持编译、测试、打包和发布等流程,而依赖管理则通过中央仓库、本地仓库和私有服务器获取和管理项目依赖。示例中展示了如何创建第一个 SpringBoot 项目并实现简单接口。
22 1
如何使用 maven 创建一个 Spring Boot项目
|
1月前
|
Java 应用服务中间件 Android开发
Eclipse创建Spring项目
本文介绍了在Eclipse中创建Spring项目的步骤,包括如何配置Tomcat服务器、创建项目、部署项目到Tomcat以及添加Spring框架所需的JAR包。
49 1
Eclipse创建Spring项目
|
29天前
|
Java Apache Maven
Java/Spring项目的包开头为什么是com?
本文介绍了 Maven 项目的初始结构,并详细解释了 Java 包命名惯例中的域名反转规则。通过域名反转(如 `com.example`),可以确保包名的唯一性,避免命名冲突,提高代码的可读性和逻辑分层。文章还讨论了域名反转的好处,包括避免命名冲突、全球唯一性、提高代码可读性和逻辑分层。最后,作者提出了一个关于包名的问题,引发读者思考。
Java/Spring项目的包开头为什么是com?
|
1月前
|
前端开发 Java Spring
【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象
【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象
103 2
|
1月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
53 2
|
1月前
|
XML Java 应用服务中间件
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
160 2

热门文章

最新文章