這幾天在使用SpringBoot2的時候,發現了許多奇奇怪怪的bug,一樣的配置,在Spring中不會發生的問題,在SpringBoot下突然就冒出來了。
通配符的使用:
為了減少頁面的配置,經常會使用通配符,如下列代碼,作用是:Url自動匹配core文件夾下的同名文件。
@RequestMapping(value = "core/**", method = RequestMethod.GET) public void core() { }
但是在SpringBoot下,這是十分危險的,如果未找到頁面,代碼會嘗試尋找跟它匹配的路徑,自動地幫我們去轉發頁面,轉發之后依舊找不到,然后繼續轉發,始終未找到目標頁面,就產生了無限轉發,最終導致內存溢出(現象如此,暫未查看源碼)。
下列日志:因為未找到 core/excel 路徑,DispatcherServlet竟然自動拼接路徑,然后進行頁面轉發 ,轉發完還是找不到,然后路徑就越拼接越長,最后內存溢出。
2019-12-17 00:32:46.614 [http-nio-8081-exec-3] DEBUG org.springframework.web.servlet.DispatcherServlet - "FORWARD" dispatch for GET "/Sea/core/
excel/core/excel/core/excel/core/excel/core/excel/core/excel/core/excel/core/excel/list?_bust=1576513963087", parameters={masked}
簡單的處理方式就是在路徑結尾加上后綴
@RequestMapping(value = "core/**/*.ftl", method = RequestMethod.GET) public void core() { }
靜態資源與模版不要取同名:
static下的資源文件都是可以直接訪問的,template下的文件,配置后方可使用,這就產生一個問題:各放1個同名文件會如何?
比如:在static文件夾放了a.js,然后在template文件夾放了a.ftl,然后將兩個路徑前綴設置成一個樣,使用 ‘xx/xx/a’ 路徑進行訪問。很明顯,只有其中1個能訪問,在配置了RequestMapping的情況下,未找到頁面之后,直接報404錯誤,而不會再去查找static目錄;如果沒配置 RequestMapping,則直接訪問static目錄。
如果希望讓程序自動去識別,要么在static放置a.js,要么就在template放置a.ftl,存在哪個文件,自動獲取哪個,這種設計則是不允許的。
因此,static和template兩個目錄中的文件,盡可能選用完全不同的命名方式,避免出現意想不到的錯誤。
而且,Servlet下需要很清楚一點,請求最后的擴展名,經常是被程序直接忽略的。比如 http://localhost/xx/1.png,最后面的 “.png”極有可能被忽略,擴展名本身可寫可不寫,它並不影響程序的執行,因此,如果在目錄中放置了同名文件,則需要着重觀察代碼的執行情況。