복붙노트

[SPRING] URL 패턴을 기반으로 스프링 부트 필터를 적용하는 방법은 무엇입니까?

SPRING

URL 패턴을 기반으로 스프링 부트 필터를 적용하는 방법은 무엇입니까?

스프링 부트 필터를 만들었습니다. @Component 주석을 사용하여 GenericFilterBean을 구현합니다.

@Component 
public class MyAuthenticationFilter  extends GenericFilterBean {
...
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
...
}
}

이 필터는 Spring Boot Framework에 의해 자동으로 식별되며 모든 REST API에서 올바르게 작동합니다. 이 필터를 / api / secure / *와 같은 특정 URL 경로에만 적용하고 싶지만 올바른 방법을 찾을 수 없습니다. @WebFilter를 시도했지만 작동하지 않았습니다. XML 구성이나 서블릿 이니셜 라이저를 사용하지 않고 단지 주석 만 사용합니다.

작동 시키려면 올바른 방법은 무엇입니까?

해결법

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

    1.다음과 같은 필터를 추가 할 수 있습니다.

    다음과 같은 필터를 추가 할 수 있습니다.

    @Bean
    public FilterRegistrationBean someFilterRegistration() {
    
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(someFilter());
        registration.addUrlPatterns("/url/*");
        registration.addInitParameter("paramName", "paramValue");
        registration.setName("someFilter");
        registration.setOrder(1);
        return registration;
    } 
    
    @Bean(name = "someFilter")
    public Filter someFilter() {
        return new SomeFilter();
    }
    
  2. ==============================

    2.OncePerRequestFilter를 확장 할 수 있다면 다른 옵션이 있습니다. 예 :

    OncePerRequestFilter를 확장 할 수 있다면 다른 옵션이 있습니다. 예 :

    public class SomeFilter extends OncePerRequestFilter {
    
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
            // your filter logic ....
        }
    
        @Override
        protected boolean shouldNotFilter(HttpServletRequest request) {
            String path = request.getServletPath();
            return !path.startsWith("/api/secure/");
        }
    }
    
  3. ==============================

    3.@ user1283002 @WebFilter를 사용하는 것이 가능하다고 생각합니다. 나는이 기사를 우연히 발견했다. 기사별로 (나 자신을 시도하지 않은) :

    @ user1283002 @WebFilter를 사용하는 것이 가능하다고 생각합니다. 나는이 기사를 우연히 발견했다. 기사별로 (나 자신을 시도하지 않은) :

    @WebFilter(urlPatterns = "/api/count")
    public class ExampleFilter implements Filter{
        // ..........
    }
    
    // and let Spring know to scan to find such @WebFilter annotation in your config
    // class by using the @ServletComponentScan annotation like
    
    @ServletComponentScan
    @SpringBootApplication
    public class MyApplication extends SpringBootServletInitializer {
    
        public static void main(String[] args) throws Exception {
            SpringApplication.run(MyApplication.class, args);
        }
    
       // ..........
    
    }
    

    편집하다: @ServletComponentScan에 대한 문서를 더 읽은 후 흥미로운 면책 조항을 발견했습니다.

    즉, 웹 컨테이너 (예 : Apache Tomcat)에 애플리케이션을 배치 할 때이 클래스는 Spring 프레임 워크에서 스캔되지 않으므로 해당 클래스의 스프링 구성 (있는 경우)이 적용되지 않습니다.

    추가로 변경하지 않아도되는 Spring 설정이 없다면 @Component 스캔을 필터에 추가하지 않고 패키지가 @ComponentScan 주석의 경로에 있는지 확인하십시오.

  4. from https://stackoverflow.com/questions/39710526/how-to-apply-spring-boot-filter-based-on-url-pattern by cc-by-sa and MIT license