복붙노트

[SPRING] Spring 부트 애플리케이션에 서블릿 필터 추가하기

SPRING

Spring 부트 애플리케이션에 서블릿 필터 추가하기

나는 ETag suport를 가지고 싶습니다. 이 목적을 위해 모든 작업을 수행하는 ShallowEtagHeaderFilter가 있습니다. 어떻게해도 web.xml에 선언하지 않고 추가 할 수 있습니까? 실제로 존재하지 않습니다.

추신 나는 스프링 부트 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;
    }

}

해결법

  1. ==============================

    1.참조 문서에서 언급했듯이 필요한 유일한 단계는 필터를 구성 클래스의 Bean으로 선언하는 것입니다.

    참조 문서에서 언급했듯이 필요한 유일한 단계는 필터를 구성 클래스의 Bean으로 선언하는 것입니다.

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

    이미 WebApplicationInitializer를 확장하고있을 것입니다. 그렇지 않다면 webapp 설정을 web.xml 파일에서 WebApplicationInitializer 클래스로 변환해야합니다.

    컨텍스트 구성이 XML 파일에있는 경우 AbstractDispatcherServletInitializer를 확장하는 클래스를 만들 수 있습니다. 구성 클래스를 사용하는 경우 AbstractAnnotationConfigDispatcherServletInitializer가 적절한 선택입니다.

    어떤 경우 든 필터 등록을 추가 할 수 있습니다.

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

    코드 기반 서블릿 컨테이너 초기화의 전체 예제는 Spring 참조 문서에서 사용 가능하다.

  2. ==============================

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

    더보기 : @AliasFor, 봄 맞춤 주석 질문

  3. from https://stackoverflow.com/questions/26151057/add-a-servlet-filter-in-a-spring-boot-application by cc-by-sa and MIT license