Hyunebee
필터와 인터셉터 본문
필터
스프링 외부에 존재 서블릿에서 제공하는 공통처리 기능
스프링 내로 요청이 들어오기 전과 스프링의 요청이 나갈 때 처리 기능을 함
조금더 low level의 처리가 가능하다.
인터셉터
스프링에서 제공하는 공통처리 기능
실제 매핑된 Handler 확인 가능
조금 더 상세한 조건식과 세부적인 스펙을 통해 구체적인 시점에 구체적인 동작이 가능하다.
AOP와 비교한다면 AOP는 인터셉터보다 더 구체적인 조건과 동작을 가진다.

실습
아래는 @Component를 통해 자동으로 스프링 컨테이너 부착
@Component
@Slf4j
public class LogFilter implements Filter{
@Override
public void doFilter(
ServletRequest request, ServletResponse response, FilterChain chain //외부 -> filter -> 처리 -> filter -> 외부
) throws ServletException, IOException {
log.info("Hello filter : " + Thread.currentThread());
chain.doFilter(request, response);
log.info("Bye filter : " + Thread.currentThread());
}
}

필터는 자동으로 컨테이너에 부착되지 않음으로 RegistrationBean을 해줘야함
@Configuration
public class WebConfig {
//필터는 자동으로 컨테어너에 부착되지 않음 등록시켜줘야함
@Bean
public FilterRegistrationBean loggingFilter(){
FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
filterFilterRegistrationBean.setFilter(new LogFilter());
filterFilterRegistrationBean.setOrder(1);
filterFilterRegistrationBean.addUrlPatterns("/*");
return filterFilterRegistrationBean;
}
}
인터셉터 등록
인터셉터 또한 이 상태로 둔다면 클래스와 다름없음 등록을 해줘야함
@Slf4j
public class LogInterceptor implements HandlerInterceptor {
@Override
//요청시 try와 같은 느낌
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("preHandle Interceptor : " + Thread.currentThread());
log.info("preHandle handler : " + handler);
return true;
}
@Override// 요청이 성공하면
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("postHandle Interceptor : " + Thread.currentThread());
}
@Override// 요청이 성공하든 실패하던
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("afterCompletion Interceptor : " + Thread.currentThread());
if (ex != null) {
log.error("afterCompletion exception : " + ex.getMessage());
}
}
}
해당 @Configuration에 WebMvcConfigurer를 구현 addInterceptors를 추가해줘야 한다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor())
.order(1).addPathPatterns("/*")
.excludePathPatterns("/css/*", "/image/*");
}
//필터는 자동으로 컨테어너에 부착되지 않음 등록시켜줘야함
@Bean
public FilterRegistrationBean loggingFilter(){
FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
filterFilterRegistrationBean.setFilter(new LogFilter());
filterFilterRegistrationBean.setOrder(1);
filterFilterRegistrationBean.addUrlPatterns("/*");
return filterFilterRegistrationBean;
}
}

'zerebase > Spring' 카테고리의 다른 글
Lombok (0) | 2022.06.23 |
---|---|
스프링 MVC의 기본 HTTP요청 매핑 (0) | 2022.06.16 |
Valudation, Data Binding, SpEL (0) | 2022.06.16 |
OOP와 스프링 (0) | 2022.06.10 |