加載順序會影響對spring bean 的調用。
比如filter 需要用到 bean ,但是加載順序是 先加載filter 後加載spring,則filter中初始化操作中的bean爲null;
首先可以肯定 加載順序與他們在web.xml 文件中的先後順序無關。
web.xml 中 listener 和 serverlet 的加載順序爲 先 listener 後serverlet
最終得出結果:先 listener >> filter >> servlet >> spring
所以,如果過濾器中要使用到 bean,可以將spring 的加載 改成 Listener的方式
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
搞定!
關於他們的內部執行順序,也需要注意,如下面文章中遇到的問題
web.xml的filter執行順序導致的亂碼,切記!
2008-05-02 01:38
發現引起bug的原因是web.xml的下面幾行:
<filter-mapping>
<filter-name>SecurityFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CharacterEncoding</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CharacterEncoding</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
根據servlet2.3規範filter執行是按照web.xml配置的filter-mapping先後順序進行執行,所以上面的配置會導致遇見*.do的url請求,先進行SecurityFilter的過濾器處理,這時候沒有做編碼處理,已經是亂碼,到下面的filter處理時已經時亂碼,再做編碼處理已經沒有用處。
修正方式,調整filter-mapping順序,如下:
<filter-mapping>
<filter-name>CharacterEncoding</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CharacterEncoding</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>SecurityFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/wayfoon322/archive/2008/05/08/2418011.aspx