import jakarta.servlet.Filter;
import java.io.IOException;
public class MyFilter1 implements Filter {
@Override
public void doFilter(jakarta.servlet.ServletRequest request, jakarta.servlet.ServletResponse response, jakarta.servlet.FilterChain chain) throws IOException, jakarta.servlet.ServletException {
System.out.println("필터1");
chain.doFilter(request,response);
}
}
doFilter
의 역할은 처리결과를 다음으로 넘겨주는 역할을 하니 꼭 구현하자
다음 필터가 있다면 다음 필터로, 없다면 서블릿으로 넘겨주게 된다.
이미지 출처 : http://atin.tistory.com/590
간단한 설명 : https://siyoon210.tistory.com/32
자세한 내용은 Spring Security Doc을 보면 각 필터마다 설명이 나와있다.
https://docs.spring.io/spring-security/reference/servlet/index.html
그런데 내가 공식문서를 읽다보니까 Security Filters의 Ordering에 대해 설명한 부분이 있는데, 위의 그림에는 빠진 부분이 많은 것같아서, 링크를 첨부한다.
내가 확실히 이해한게 맞다면 아래의 링크를 참조하는것이 훨씬 정확하다.
https://docs.spring.io/spring-security/reference/servlet/architecture.html#servlet-security-filters
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig{
private final CorsFilter corsFilter;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
http.addFilterBefore(new MyFilter1(), BasicAuthenticationFilter.class);
//http.addFilterAfter(new MyFilter1(), BasicAuthenticationFilter.class);
// ...
return http.build();
}
}
위의 SecurityFilterChain
의 순서를 참고하여 전(http.addFilterBefore
)이나 후(http.addFilterAfter
)를 통해 필터를 등록할 수 있다.
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<MyFilter1> filter1(){
FilterRegistrationBean<MyFilter1> bean = new FilterRegistrationBean<>(new MyFilter1());
bean.addUrlPatterns("/*");
bean.setOrder(0); // 우선순위를 결정한다. 낮을수록 빨리 실행됨
return bean;
}
}
이런식으로 @Bean
에 등록을 하여 사용할 수 있다.
보면 setOrder로 우선순위를 지정할 수 있다.
0 -> 1 -> 2 -> 3 -> ... 이런식으로 실행된다.
FilterConfig
에 넣은 필터보다 SecurityConfig
에 넣은 필터가 먼저 실행되게 된다.
즉 SecurityConfig에 있는 필터가 다 실행되고 나서 FilterConfig
에 있는 필터가 설정한 order 대로 실행된다. 따라서 가장 먼저 실행되고 싶으면, 위의 FilterChain
순서표를 참고하여 addFilterBefore
메서드를 통해 가장 먼저 실행되게 하면 된다.