2017-05-03 100 views
0

的web.xml:春天注射過濾器實現在web.xml中映射

<filter> 
    <filter-name>myFilter</filter-name> 
    <filter-class>com.mypackage.MyFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>myFilter</filter-name> 
    <url-pattern>/myFilterPattern/*</url-pattern> 
</filter-mapping> 

MyFilter:

public class MyFilter implements Filter { 

    @Autowired 
    InjectedBean someInjectedBean; 

然而,攔截/myFilterPattern/*請求,someInjectedBeanMyFilter.doFilter(...)仍然是空,這意味着它具有當未被注射。同樣的bean(InjectedBean)在web.xml中未引用的其他上下文組件中被正確注入。

是因爲容器過濾發生在Spring上下文之外嗎?有沒有什麼辦法在Filter中實現映射到web.xml中的Spring注入?

回答

2

由於Filter不是Spring bean(它是一個Web組件),所以注入將不會在它們內部工作。彈簧不會注入到Web組件內部。

使用DelegatingFilterProxy,這是一個過濾器實現,它將springbean名稱作爲init參數並將過濾器請求委託給該bean。

<filter> 
    <filter-name>myFilter</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    <init-param> 
    <param-name>targetBeanName</param-name> 
    <param-value>myFilterBean<param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>myFilter</filter-name> 
    <url-pattern>/myFilterPattern/*</url-pattern> 
</filter-mapping> 

然後在spring的上下文中創建一個名爲customFilterBean的Bean。

public class MyFilter extends GenericFilterBean { 

    @Autowired 
    InjectedBean someInjectedBean; 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 
     chain.doFilter(request, response); 
    } 
} 
+0

您的意思是「在您的spring context中創建一個名爲** myFilterBean **的Bean」? – amphibient

+0

是使用MyFilter類型的名稱myFilterBean創建一個bean。 MyFilter可以擴展GenericFilterBean。 –

+0

你認爲該bean的範圍應該在上下文中?會議? – amphibient