【问题标题】:What is the difference between FilterRegistrationBean and DelegatingFilterProxy?FilterRegistrationBean 和 DelegatingFilterProxy 有什么区别?
【发布时间】:2019-05-06 07:04:24
【问题描述】:

都是注册过滤器的不同方式,FilterRegistrationBean 提供排序选项。 DelegatingFilterProxy作为代理注册过滤器,但是FilterRegistrationBean是如何注册过滤器的呢? 在 servlet 容器中注册过滤器有什么区别。

Spring boot 使用 FilterRegistrationBean 而不是 DelegatingFilterProxy 为什么?

FilterRegistrationBean 是直接添加过滤器作为 servlet 过滤器还是也使用 DelegatingFilterProxy 之类的实现?

【问题讨论】:

    标签: spring spring-boot spring-mvc servlet-filters


    【解决方案1】:

    [DelegatingFilterProxy] 用于在您的应用程序上下文中配置Filter,并在web.xml 中进行URL 映射或替换。它将在ApplicationContext 中查找过滤器并执行配置的Filter。这个类也是 Spring Framework 的一部分。它本身也是一个servlet Filter,因为它充当ApplicationContext 中配置的实际Filter 实例的代理。

    FilterRegistrationBean 顾名思义,是一个 bean,用于提供注册Filter 实例的配置。它可用于提供 URL 映射等内容。它是 Spring Boot 使用的附加配置组件,因此它可以添加此 FilterRegistrationBean 引用的 Filter 可以注册(或不注册!)作为过滤器的一部分链。

    【讨论】:

    • FilterRegistrationBean 是直接添加过滤器作为 servlet 过滤器还是也使用 DelegatingFilterProxy 之类的实现?
    • FilterRegistrationBean 是一个配置组件,只是它本身不是过滤器。正如我试图解释的那样,它的用例不同,然后是DelegatingFilterProxy。
    【解决方案2】:

    FilterRegistrationBean 是一个帮助你注册过滤器的 Spring Bean。

    DelegatingFilterProxy 本身就是一个过滤器。例如,可以使用FilterRegistrationBean 将其注册到 ServletContext 中,如下所示:

    @Bean
    public FilterRegistrationBean filterChainRegistration() {
    DelegatingFilterProxy filterProxy = new DelegatingFilterProxy();
    filterProxy.setTargetBeanName(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME);
    FilterRegistrationBean registrationBean = new FilterRegistrationBean(delegatingFilterProxy);
    registrationBean.setName(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME);
     registrationBean.addUrlPatterns("/*");
    return registrationBean;
    }
    

    编辑:

    来自Spring Documentation:“在 Servlet 3.0+ 容器中注册过滤器的 ServletContextInitializer。类似于 ServletContext 提供的注册功能,但采用 Spring Bean 友好设计。 必须在调用 RegistrationBean.onStartup(ServletContext) 之前指定过滤器。注册可以与 URL 模式和/或 servlet 相关联(通过名称或通过 ServletRegistrationBeans。当没有指定 URL 模式或 servlet 时,过滤器将关联到 '/*'。如果未指定,将推断过滤器名称。 .

    【讨论】:

    • FilterRegistrationBean 是直接添加过滤器作为 servlet 过滤器还是也使用 DelegatingFilterProxy 之类的实现?
    • 我们可以使用 DelegatingFilterProxy 直接添加过滤器,而不需要使用 FilterRegistrationBean。因为 DelegatingFilterProxy 在 web.xml 中注册为代理过滤器,并且请求将调用实际的实现。
    • 我已经在帖子中回复了你。
    • @Bean private Filter CORSFilter() { return new CORSFilter();我们可以在 spring boot 注释主类中像这样简单地添加,但是这个配置适用于上下文 url,即所有请求。
    猜你喜欢
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    • 2015-03-26
    • 2013-08-19
    相关资源
    最近更新 更多