【问题标题】:Add a Servlet Filter in a Spring Boot application在 Spring Boot 应用程序中添加 Servlet 过滤器
【发布时间】:2014-11-26 20:46:39
【问题描述】:

我想要ETag suport。为此,有一个ShallowEtagHeaderFilter 可以完成所有工作。我如何添加它而不在我的web.xml 中声明它(它实际上不存在,因为到目前为止我不知何故没有它)?

附:我使用 Spring Boot 1.1.4

附言这是一个完整的解决方案

package cuenation.api;

import org.springframework.boot.context.embedded.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.ShallowEtagHeaderFilter;

import javax.servlet.DispatcherType;
import java.util.EnumSet;

@Configuration
public class WebConfig {

    @Bean
    public FilterRegistrationBean shallowEtagHeaderFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new ShallowEtagHeaderFilter());
        registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
        registration.addUrlPatterns("/cue-categories");
        return registration;
    }

}

【问题讨论】:

  • 嗯,您的问题包含解决方案的链接。只需向下滚动几行。
  • @zeroflagL 向下滚动几行:这里还是 spring 文档中?我没有关注你!
  • @zeroflagL 哦,我明白你的意思了。但我的问题是我没有任何 xml 配置。见my custom initializer。我做错了什么?
  • 如何将 ShallowEtagHeaderFilter 添加到项目中,以便它可以评估并将 Etag 发送到浏览器。我们需要覆盖任何东西吗?

标签: spring annotations servlet-filters spring-boot


【解决方案1】:

使用 Spring Boot 时

作为mentioned in the reference documentation,唯一需要的步骤就是将该过滤器声明为配置类中的一个Bean,就是这样!

@Configuration
public class WebConfig {

  @Bean
  public Filter shallowEtagHeaderFilter() {
    return new ShallowEtagHeaderFilter();
  }
}

使用 Spring MVC 时

您可能已经在扩展WebApplicationInitializer。如果没有,那么您应该将您的 webapp 配置从 web.xml 文件转换为 WebApplicationInitializer 类。

如果您的上下文配置存在于 XML 文件中,您可以创建一个扩展 AbstractDispatcherServletInitializer 的类 - 如果使用配置类,AbstractAnnotationConfigDispatcherServletInitializer 是正确的选择。

在任何情况下,您都可以添加过滤器注册:

  @Override
  protected Filter[] getServletFilters() {
    return new Filter[] {
      new ShallowEtagHeaderFilter();
    };
  }

code-based Servlet container initialization are available in the Spring reference documentation 的完整示例。

【讨论】:

  • 不,我既不直接也不间接地扩展WebApplicationInitializer。实际上我唯一的配置是application.properties,我把我的mongodb连接字符串放在那里。我试图扩展AbstractAnnotationConfigDispatcherServletInitializer,但它需要实现我一堆方法。
  • 好的,我添加了my custom initializer。但是貌似春天看不到它。我在这里搞砸了什么?
  • 所以你可能在某个地方有一个 web.xml 文件......它是 web.xml(使用 XML 配置你的 webapp)或 WebApplicationInitializer。我在回答中添加了一个完整的示例。
  • 没有,我上面说了我除了application.properties之外没有任何配置文件
  • 好吧,我终于figured this out
【解决方案2】:

回答有点晚了。

我的解决方案是创建自定义注释:

import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Component;

// ...

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Component
public @interface Filter {

    @AliasFor(annotation = Component.class, attribute = "value")
    String value() default "";

}

然后简单地将其应用于过滤器实现:

@Filter
public class CustomFilter extends AbstractRequestLoggingFilter {

    @Override
    protected void beforeRequest(HttpServletRequest request, String message) {
        logger.debug("before req params:", request.getParameterMap());
    }

    @Override
    protected void afterRequest(HttpServletRequest request, String message) {
        logger.debug("after req params:", request.getParameterMap());
    }
}

查看更多:@AliasForSpring custom annotations question

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 2016-07-31
    • 2013-11-18
    相关资源
    最近更新 更多