首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring MVC 攔截器誤攔截靜態資源導致空指針異常的排查實錄

     編輯:Java 綜合教學

Spring MVC 攔截器誤攔截靜態資源導致空指針異常的排查實錄

今天花了大半天時間解決一個路徑問題,專案使用相對路徑,但資料夾嵌套層級過深,導致路徑解析錯誤。我嘗試在進入頁面時直接獲取上下文路徑,試了多種方法均無效,最終決定使用 Spring MVC 的攔截器,卻由此開啟了一段「巨坑」之旅,耗費近兩小時才走出誤區。

問題的起因:攔截器配置

我在 Spring 配置文件中定義了如下攔截器:

<mvc:interceptors>
  <mvc:interceptor>
    <mvc:mapping path="/**" />
    <bean class="com.muke.springMVC.interceptors.PathInterceptors" />
  </mvc:interceptor>
</mvc:interceptors>

攔截器邏輯很簡單:從請求中獲取上下文路徑,放入 ModelAndView 中供頁面使用。這段代碼是從網上複製的,卻成了禍根。

現象:控制台狂噴空指針,URL 異常追加參數

應用啟動後,一進入頁面控制台就拋出大量空指針異常。觀察發現:攔截器被重複執行多次,頁面上的資源路徑錯誤,URL 甚至自動追加了我放入 Model 的屬性名和值。起初我以為是 ModelAndView 導致 URL 重寫,便深入研究該對象,卻發現代碼邏輯無誤,為何會拋空指針?為何一次請求觸發多次攔截?

真相:靜態資源請求同樣被攔截

直到最後才恍然大悟:path="/**" 匹配了所有請求,包括 CSS、JS、圖片等靜態資源。這些請求進入攔截器時,無法獲取有效的上下文路徑(或相關對象為空),導致 modelAndView.addObject 時拋出空指針。由於靜態資源請求失敗,瀏覽器不斷重試,引發攔截器瘋狂重複執行。

教訓與解決方案

這已是第二次踩靜態資源被攔截的坑。解決方法是排除靜態資源路徑,或使用 <mvc:resources> 標籤映射靜態資源,讓其繞過攔截器。切記:攔截器路徑映射務必精確,避免「/**」這類貪婪匹配吞噬靜態資源請求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved