Spring Boot Web Servlet : DelegatingFilterProxyRegistrationBean

DelegatingFilterProxyRegistrationBeanSpring Boot提供的针对Servlet 3.0+ Web的一个注册器Bean(RegistrationBean)。它的作用是向Servlet容器注册一个Servlet Filter,实现类为DelegatingFilterProxy。该Filter DelegatingFilterProxy虽然实现了Filter接口,但它其实只是一个代理,DelegatingFilterProxyRegistrationBean为其指定了Spring IoC容器中另外一个Filter bean作为被代理的Filter bean。最终Servlet容器调用该Filter DelegatingFilterProxy时,其实最终任务执行落在被代理的那个Filter bean上。

DelegatingFilterProxyRegistrationBean继承自AbstractFilterRegistrationBean。基类AbstractFilterRegistrationBean定义了向Servlet容器注册并配置一个Filter的通用逻辑,其子实现类负责将要被注册到Servlet容器的Filter的提供。DelegatingFilterProxyRegistrationBean正是这样一个子类,它提供的Filter是基于指定名称构建的一个DelegatingFilterProxy Filter。跟DelegatingFilterProxyRegistrationBean类似的另外一个注册器BeanFilterRegistrationBeanFilterRegistrationBean也继承自AbstractFilterRegistrationBean,但不同的是,FilterRegistrationBeanServlet容器注册的是某个Filter对象自身,而不是一个代理Filter对象。

基于DelegatingFilterProxyRegistrationBean及其基类AbstractFilterRegistrationBean所定义的能力,可以做到以下几点 :

  1. Servlet容器注册一个DelegatingFilterProxy Filter用于代理Spring IoC容器中某个指定名称的Filter bean
  2. 可以指定被代理的Filter bean应用到哪些URL路径上(通过#setUrlPatterns);
  3. 可以指定被代理的Filter bean应用到那些Servlet上(通过#setServletNames或者#setServletRegistrationBeans);
  4. 如果没有指定被代理的Filter bean应用到哪些URL/Servlet上,则缺省应用到/*上。

DelegatingFilterProxyRegistrationBean的使用可以参考SecurityFilterAutoConfiguration,这是Spring Boot针对Servlet Web的一个自动配置类。它的作用就是在其他基础安全自动配置(SecurityAutoConfiguration)结束之后,向Spring IoC容器注册一个DelegatingFilterProxyRegistrationBean。而随后DelegatingFilterProxyRegistrationBean会在Servlet容器启动阶段被用于注册相应的DelegatingFilterProxy代理Filter

源代码

源代码版本 : Spring Boot 2.1.3.RELEASE

package org.springframework.boot.web.servlet;

import javax.servlet.Filter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.util.Assert;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.filter.DelegatingFilterProxy;

public class DelegatingFilterProxyRegistrationBean
		extends AbstractFilterRegistrationBean<DelegatingFilterProxy>
		implements ApplicationContextAware {

	private ApplicationContext applicationContext;

	private final String targetBeanName;

	/**
	 * Create a new DelegatingFilterProxyRegistrationBean instance to be
	 * registered with the specified ServletRegistrationBeans.
	 * @param targetBeanName name of the target filter bean to look up in the Spring
	 * application context (must not be null). 被代理的Filter bean的名称,必须不能是null
	 * @param servletRegistrationBeans associate ServletRegistrationBeans
	 */
	public DelegatingFilterProxyRegistrationBean(String targetBeanName,
			ServletRegistrationBean<?>... servletRegistrationBeans) {
		super(servletRegistrationBeans);
		Assert.hasLength(targetBeanName, "TargetBeanName must not be null or empty");
		this.targetBeanName = targetBeanName;
		setName(targetBeanName);
	}

	@Override
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		this.applicationContext = applicationContext;
	}

	protected String getTargetBeanName() {
		return this.targetBeanName;
	}

    // 构建要注册到Servlet容器的Filter,总是一个 DelegatingFilterProxy,代理到
    // 名称为 targetBeanName 的目标 Filter bean
	@Override
	public DelegatingFilterProxy getFilter() {
		return new DelegatingFilterProxy(this.targetBeanName,
				getWebApplicationContext()) {

			@Override
			protected void initFilterBean() throws ServletException {
				// Don't initialize filter bean on init()
			}

		};
	}

	private WebApplicationContext getWebApplicationContext() {
		Assert.notNull(this.applicationContext, "ApplicationContext be injected");
		Assert.isInstanceOf(WebApplicationContext.class, this.applicationContext);
		return (WebApplicationContext) this.applicationContext;
	}

}

参考资料

Spring Boot Web Servlet : AbstractFilterRegistrationBean
Spring Boot 自动配置 : SecurityAutoConfiguration
Springboot 自动配置 : SecurityFilterAutoConfiguration
Spring Web : DelegatingFilterProxy

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值