반응형
필터와 인터셉터는 컨트롤러가 호출되기 전 요청과 응답을 가로채서 공통 로직을 수행한다.
순서
Filter → Interceptor → AOP → Interceptor → Filter
Filter
- 스프링 컨텍스트 외부(DispatcherServlet 앞 단)에서 request와 response의 해당하는 작업을 가로채어 공통 로직을 수행
- 웹 어플리케이션에서 전역적으로 처리해야 하는 로직을 구현
- HTTP 요청과 응답을 변경할 수 있는 재사용이 가능한 코드
- web.xml 또는 어노테이션으로 필터를 설정/매핑할 수 있다.
method
- init(FilterConfig filterConfig) : 필터가 생성될 때 초기화 시 사용
- doFilter(ServletRequest request, SevletResponse response, FilterChain chain) : 요청 시마다 필터가 실행하는 메서드
- destroy() : 필터가 소멸할 때 실행
필터 생성 예제 링크
https://taetaetae.github.io/2020/04/06/spring-boot-filter/
스프링부트 필터 적용 방법
- @WebFilter 어노테이션 사용
@ServletComponentScan // !!
@SpringBootApplication
public class PizzahouseApplication {
public static void main(String[] args) {
SpringApplication.run(PizzahouseApplication.class, args);
}
}
@Configuration
public class TestConfig implements WebMvcConfigurer {
// 특정 패턴의 URI 추가
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TestInterceptor())
.addPathPatterns("/test") // 특정 URL 지정
.excludePathPatterns("/orders"); // 특정 URL 배제
}
}
@Slf4j // LOGGING 어노테이션
@WebFilter(urlPatterns = "/test")
public class TestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println(">>>>> 필터 생성~~~");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println(">>>>> doFilter ~~~~~~~~~");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
System.out.println(">>>>> destroy 샤따 내려요~~~~~~~~");
}
}
- FilterRegistrationBean 사용
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("############ MyFilter init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("############ MyFilter doFilter");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
System.out.println("############ MyFilter destroy");
}
}
@Configuration
public class SimpleFilter {
@Bean
public FilterRegistrationBean<MyFilter> myFilter() {
// FilterRegistrationBean으로 감싸지 않아도 필터 작동은 한다.
// 하지만 urlpattern 추가 등의 FilterRegistrationBean에서 제공해주는 기능을 사용하고 싶다면 감싸는게 편하다.
FilterRegistrationBean<MyFilter> bean = new FilterRegistrationBean<>(new MyFilter());
bean.addUrlPatterns("/orders/*");
System.out.println("########################################");
System.out.println("create myFilter !!!!!!!!");
System.out.println("########################################");
return bean;
}
}
FilterRegistrationBean으로 메서드 만들어서 @Bean으로 생성하면 (@Component 안 하고 ) 어노테이션 설정 안 해도 됨
→ 필터가 많으면 그냥 @Configuration 구현한 클래스에 필터를 빈으로 따로 생성해서 사용하자. 굳이 파일 열어서 경로 지정을 안해줘도 된다.
Interceptor
- 스프링에서 제공하는 기능
- Dispatcher servlet에서 Handler 로 가기 전에 처리
- 디테일한 처리(인증, 권한 등)에 대한 로직을 처리
method
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) : Controller 들어가기 전에 수행됨
- postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) : 컨트롤러에서 return 될 때 화면 띄우기 직전에 수행됨.
- afterCompletion() : 화면처리까지 끝난 뒤에 호출됨
반응형
'Dev > Spring' 카테고리의 다른 글
[SpringBoot] JUnit5 - @ParameterizedTest, @ValueSource, @CsvSource (0) | 2022.02.05 |
---|---|
[SpringBoot] 스프링부트에서 캐싱하기 (Cache in Springboot) (0) | 2022.02.05 |
[Spring] AOP(Aspected-Oriented Programming) (0) | 2022.02.05 |
[Spring] Singleton / Prototype (0) | 2022.01.17 |
[Spring] 스프링이 빈 스코프를 싱클톤으로 만드는 이유 (0) | 2022.01.17 |
댓글