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

Servlet Filter 重複初始化原因:同一類配置多個 節點

     編輯:程式設計綜合問答

現象

容器啟動時,自定義 EncodingFilter 的構造函數與 init() 被調用**兩次**,且 FilterConfig 名稱不同:

創建過濾器 EncodingFilter
Encoding Filter init, config: ApplicationFilterConfig[name=encodingFilter, ...]
創建過濾器 EncodingFilter
Encoding Filter init, config: ApplicationFilterConfig[name=filter.EncodingFilter, ...]

根因

在 web.xml 中為同一過濾器類配置了兩個 <filter> 節點(名稱不同,類相同):

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>filter.EncodingFilter</filter-class>
</filter>
<filter>
    <filter-name>filter.EncodingFilter</filter-name>  <!-- 第二個節點 -->
    <filter-class>filter.EncodingFilter</filter-class>
</filter>

容器按**配置節點**實例化過濾器,而非按類。兩個節點 → 兩個實例 → 兩次初始化。

解決方法

  1. 刪除多餘節點: 保留一個 <filter> 定義,<filter-mapping> 可映射多個 URL 模式。
  2. 合併映射:
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/login.jsp</url-pattern>
    </filter-mapping>
    

最佳實踐

  • 一個過濾器類在 web.xml 中**只定義一次**。
  • 若需不同初始化參數,可在同一 <filter> 內配置多個 <init-param>,或編寫多個子類。
  • 使用註解(@WebFilter)時同理:不要在同一類上重複標註,或確保 servletNames/urlPatterns 合併。

總結

Filter 重複初始化 99% 由 **web.xml 重複配置** 引起。檢查 <filter> 節點數量,保留一個即可解決。

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