在Spring Boot应用程序中添加Servlet过滤器

时间:2014-10-01 21:34:24

标签: spring annotations servlet-filters spring-boot

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

P.S。我使用Spring Boot 1.1.4

P.P.S。这是一个完整的解决方案

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;
    }

}

2 个答案:

答案 0 :(得分:33)

使用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

的完整示例

答案 1 :(得分: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