1. 程式人生 > >Spring專案中修改javamelody對映url以及其它引數失效的問題

Spring專案中修改javamelody對映url以及其它引數失效的問題

首先,servlet3.0支援模組化,在jar包中如果有web-fragmenet.xml,則servlet容器會先載入web.xml裡的listener、filter和servlet,再載入web-fragment.xml裡的元件。關於模組化的介紹:https://blog.csdn.net/chunxiaqiudong5/article/details/52840088

在javamelody-core中的META-INF目錄下有一個web-fragment.xml檔案,內容如下:

從上面檔案中可以看出,當servlet容器啟動時,會註冊javamelody中定義的MonitoringFilter和SessionListener,MonitoringFilter預設的對映url為/monitoring。

此時我們想修改對映地址或者指定使用者才能登入,有人在web.xml也配置了一個MonitoringFilter,如下:

啟動servlet容器後,輸入localhost:8080/xxx/admin,出現404,然後再輸入localhost:8080/xxx/monitoring,發現javamelody的監控頁面出來了。

為什麼自己定義的/admin沒有起作用,文章開頭已經說了,servlet容器會先載入web.xml,然後是web-fragment.xml,但是這個又和載入順序有什麼關係了,難道說後加載的會覆蓋先載入的配置嗎,答案是yes。

點開MonitoringFilter原始碼,看下面一段程式碼:

在doFilter這個方面裡,有一個getMonitoringUrl()的方法,這個方法是用來獲取init-param中的配置的monitoring-path中的引數值,也就是對映url。如果請求地址和配置的monitoring-path路徑一致,則會看到監控頁面。剛才輸入/admin無效,說明getMonitoringUrl()返回的並不是/admin,點進這個方法:

這裡可以看出,paramterValue應該是我們配置的url,是從Parameters.getParameter()中獲取的,Parameter是一個列舉,點進Parameters.getParameter()方法:

我們配置的url是從FilterConfig例項中取出來的,而FilterConfig是從哪裡來的呢,在Filter實現類裡重寫了init(FilterConfig config)方法。

在這裡,FilterConfig被注入,點進這個方法,

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不會新增,如下: