Spring[Info] Filter 와 Interceptor
2021. 7. 2. 13:52ㆍSpring/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);
}
}
반응형