본문 바로가기
Dev/Spring

[Spring] Filter, Interceptor

by ssyoni 2022. 2. 5.
반응형

 

 

필터와 인터셉터는 컨트롤러가 호출되기 전 요청과 응답을 가로채서 공통 로직을 수행한다.

순서

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/

 

스프링부트 필터 적용 방법

  1. @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 샤따 내려요~~~~~~~~");
    }
}
  1. 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() : 화면처리까지 끝난 뒤에 호출됨

 

반응형

댓글