2017-06-06 93 views
-1

是否可以動態地在過濾器鏈中添加新過濾器?我的意思是通過檢查條件/配置,我們是否可以在過濾器鏈中包含或排除特定過濾器?動態添加新過濾器

+0

是,是否有可能 –

+0

@Timothy能否請您給我這個提示嗎? – ANP

回答

0

我相信這樣的要求的簡單解決方案是添加條件的過濾條件在doFilter方法來過濾鏈。您將始終在鏈中使用此過濾器,但是當條件不滿意時,過濾器會將控制權交給下一個過濾器。

+0

感謝這個reply.If這是解決方案則是一個機會,過濾器類將不必要的執行?我同意這是一個簡單的解決方案。 – ANP

1

我認爲這是不可能在常規的web.xml文件。您可以考慮使用ServletContainerInitializer。這是以編程方式聲明您的Web應用程序配置的一種方式。

這意味着你可以通過編程設置Servlet,過濾器以及可以在常規web.xml中定義其他的事情。

E.g.在這個問題中描述瞭如何以編程方式聲明servlet Map servlet programmatically instead of using web.xml or annotations

如果您使用Spring框架,您還可以考慮使用Spring的回調來執行此操作。檢查這篇文章出來How to specify url-pattern for Servlet filters in WebApplicationInitializer?

0

這次春@ConditionalOnExpression註釋幫我加載基於配置的過濾器豆。

,我跟着

我的配置類(有@Configuration類)

使用@ConditionalOnExpression爲動態加載的bean定義一個bean的步驟(在配置文件基於)

見以下代碼片段

@Bean 
     @ConditionalOnExpression("#{environment.getProperty('security.oauth2.custom.filters').contains('XTokenFilter')}") 
     public FilterRegistrationBean xxTokenFilter() { 
      FilterRegistrationBean registrationBean = new FilterRegistrationBean(); 
      XTokenFilter xTokenFilter = new XTokenFilter(); 
      xTokenFilter.setAuthenticationManager(XOuthenticationManager()); 
      beanFactory.autowireBean(xTokenFilter); 


    registrationBean.setFilter(xTokenFilter); 
      registrationBean.setOrder(findOrderOfCustomFilters("XTokenFilter")); 
      return registrationBean; 
     } 

此bean將加載當且僅當屬性「security.oauth2.custom.filters」co ntains值XTokenFilter。