web過濾器使用spring依賴注入


1.問題描述

  在web項目中,使用filter過濾器十分常見,但是在過濾器中spring Bean即使在配置文件中配置了掃描filter對應的包,也無法正確注入spring 管理的Bean。

 

2.原因

  大概如下<摘自知乎>:

  這其中涉及到web啟動的原理。
  眾所周知,web應用啟動的順序是:listener->filter->servlet,而因為項目應用了spring mvc,所以我們會有兩個配置文件(applixationContext.xml和springMVC-sevlet.xml),我們在配置 spring時會用到spring的listener,它會讀取application.xml里的配置對spring context進行初始化;而springMVC-servlet.xml則是在spring mvc的dispathServlet啟動的時候讀取進行配置。而如果項目里用到了注解,則需要在springMVC-servlet.xml中加上“”。
  進入重點。 問題就是項目啟動時,先初始化listener,因此配置在applicationContext.xml里的bean會被初始化和注入;然后再來就filter的初始化,再接着才到我們的dispathServlet的初始化,因此,當我們需要在filter里注入一個注解的bean時,就會注入失敗,因為filter初始化時,注解的bean還沒初始化,沒法注入。所以,如果想要在filter里注入注解bean的話,就要在applicationContext.xml里配置context,也就是上面說的那句配置。在這里配置時需要注意的是,需要把tx和aop的配置放在最下面,否則也會導致spring的context初始化失敗。 把配置弄好之后,我們就在filter的init方法里,通過獲取webApplicationContext的getBean方法對需要的bean進行注入。
  以上是個人折騰了很久后的總結,希望能幫助到同樣遇到這問題的小伙伴們……
 
 
3.解決方案
  利用DelegatingFilterProxy類解決,實現filter和application.xml交互。
 
  3.1 將filter配置注釋
  @Component
  public class HtmlFilter implements Filter{
      //TODO      
  }

 

  3.2 在web.xml 配置DelegatingFilterProxy

  <filter>
        <filter-name>DelegatingFilterProxy</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
        <init-param>
            <param-name>targetBeanName</param-name>
            <param-value>htmlFilter</param-value>         
        </init-param>
        <init-param>
            <param-name>targetFilterLifecycle</param-name>
            <param-value>true</param-value><!-- 此參數必需設置-->
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>DelegatingFilterProxy</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 

 

   3.3 這樣就可以了

 

 

參考資料:

  1.https://www.zhihu.com/question/22977026/answer/23317656

  2.http://www.programgo.com/article/840680429/

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM