Spring[Info] Filter 와 Interceptor

2021. 7. 2. 13:52Spring/Spring[Info]

반응형

Filiter

  • DispatcherServlet 앞에서 먼저 동작
  • 웹 어플리케이션의 Context의 기능
  • 스프링 기능을 활용하기에 어려움
  • 일반적으로 인코딩, CORS, XSS, LOG, 인증, 권한 등을 구현

Interceptor

  • DispatcherServlet에서 Controller 사이에서 동작
  • Spring Context의 기능이며 일종의 빈
  • 스프링 컨테이너이기에 다른 빈을 중비하여 활용성이 좋음
  • 다른 빈을 활용 가능하기에 인증, 권한 등을 구현

스프링부트에서 필터 설정

1. FilterRegistrationBean으로 등록

자바 프로그래밍 방식으로 FilterRegistrationBean을 이용해서 필터로 등록한 후에 WebMvcConfigurer을 상속 받아 설정 후 빈으로 등록하는 방식

@Slf4j
public class CORSFilter implements Filter {
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		log.info("init CORSFilter");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
		
		log.info("##### filter - before #####");
		chain.doFilter(req, res);
		log.info("##### filter - after #####");
	}
	
	@Override
	public void destroy() {
		log.info("destroy CORSFilter");
	}

}
@Configuration
public class FilterConfiguration implements WebMvcConfigurer {
	
	@Bean
	public FilterRegistrationBean getFilterRegistrationBean() {
		FilterRegistrationBean registrationBean = new FilterRegistrationBean(new CORSFilter());
		registrationBean.setOrder(Integer.MIN_VALUE);
		//registrationBean.addUrlPatterns("/*");
		registrationBean.setUrlPatterns(Arrays.asList("/board/*"));
		return registrationBean;
	}
}

2. @WebFilter 어노테이션 필터 등록

내장 컨테이너를 사용하는 스프링부트에서 지원하는 어노테이션인 @WebServlet, @WebFilter 및 @WebListener 선언해서 자동 등록 후 @ServletComponetScan으로 이용하는 방식

@Slf4j
@WebFilter(urlPatterns= "/board/*")
public class XSSFilter implements Filter {
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		log.info("init XSSFilter");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
	
		log.info("##### filter - before #####");
		chain.doFilter(req, res);
		log.info("##### filter - after #####");
	}
	
	@Override
	public void destroy() {
		log.info("destroy XSSFilter");
	}
	
}
@ServletComponentScan // <-추가
@SpringBootApplication
public class NeoApplication {

	public static void main(String[] args) {
		SpringApplication.run(NeoApplication.class, args);
	}

}
반응형