以前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則調用,否則不調用。