codememo

URL 패턴에 따라 스프링 부트필터를 적용하는 방법

tipmemo 2023. 2. 16. 21:45
반응형

URL 패턴에 따라 스프링 부트필터를 적용하는 방법

스프링 부트 필터(구)를 만들었습니다.GenericFilterBean와 함께@Component주석입니다.

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

필터는 Spring Boot Framework에 의해 자동으로 식별되며 모든 REST API에서 정상적으로 동작합니다.이 필터를 다음과 같은 특정 URL 경로에만 적용합니다./api/secure/*올바른 길을 찾을 수가 없어요.나는 노력했다.@WebFilter하지만 그것은 작동하지 않았다.XML 구성이나 서블릿 이니셜라이저는 사용하지 않고 주석만 사용합니다.

어떻게 하면 제대로 작동할 수 있을까요?

확장 가능한 경우 다른 옵션이 있습니다.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/");
    }
}

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

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

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

   // ..........

}

편집: @Servlet Component Scan 관련 문서를 자세히 읽은 후 흥미로운 면책사항을 발견했습니다.

내장된 웹 서버를 사용하는 경우에만 검색이 수행됩니다.

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

Spring 설정이 없는 경우 @Component 스캔을 필터에 추가하여 패키지가 @ComponentScan 주석 경로에 있는지 확인하는 것만으로 충분합니다.

언급URL : https://stackoverflow.com/questions/39710526/how-to-apply-spring-boot-filter-based-on-url-pattern

반응형