Spring DelegatingFilterProxy解析


以前DelegatingFilterProxy是在需要使用spring security 的時候在xml中配置,如下:

<filter>
  <filter-name>springSecurityFilterChain</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
 </filter>

<filter-mapping>
  <filter-name>springSecurityFilterChain</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

所以一直以為此類是spring security中的類,后來發現不是這樣的,這個類位於spring-web包,和security沒有關系。

這個類實際上就是一個Filter的委派代理類。

這樣配置的意思是 spring管理的bean中有一個叫名字叫springSecurityFilterChain,然后把其注冊進來。

在security的AbstractSecurityWebApplicationInitializer中是這樣使用的:

/**
     * Registers the springSecurityFilterChain
     * @param servletContext the {@link ServletContext}
     */
    private void insertSpringSecurityFilterChain(ServletContext servletContext) {
        String filterName = DEFAULT_FILTER_NAME;
        DelegatingFilterProxy springSecurityFilterChain = new DelegatingFilterProxy(filterName);
        String contextAttribute = getWebApplicationContextAttribute();
        if(contextAttribute != null) {
            springSecurityFilterChain.setContextAttribute(contextAttribute);
        }
        registerFilter(servletContext, true, filterName, springSecurityFilterChain);
    }

 

這樣就是把filter配置成了一個bean,並且讓spring來管理器生命周期。

DelegatingFilterProxy本身也是一個filter,>> GenericFilterBean >> Filter 

其中有一個參數名是targetBeanName ,這就是需要代理的filter名稱,如果這個名稱為空的話,則會去找名稱是:

 

<filter-name>springSecurityFilterChain</filter-name>
的bean.
其中有個屬性targetFilterLifecycle標示是否調用代理filter的init方法。
如果為true則調用,否則不調用。

 


免責聲明!

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



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