Spring에서 사용하다가 SpringBoot로 넘어가면서 기존에 정리해놓지 않았던 내용들을 적어놓으려고 한다.
필터란? Servlet의 ServletContext의 기능으로 보고, 사용자에 의해 서블릿이 호출 되기 전과 후로 사용자 요청/응답의 헤더 정보등을 검사 하고, 설정할 수 있다.
필터와 인터셉터의 차이점
필터의 작동 위치? : DispatcherServlet 앞에서 먼저 동작
인터셉터의 작동 위치 ? : 인터셉터는 DispatcherServlet에서 Controllr(Handler) 사이에서 동작
- 필터
- Servlet Context의 기능
- 스프링 기능을 활용하기에 어려움 => 별도로 의존성을 주입해주어야 된다.
- 일반적으로 인코딩, CORS, XSS, LOG, 인증, 권한 등 을 구현
- 인터셉터
- Spring Context의 기능이며 일종의 빈
- 스프링 컨테이너이기에 다른 빈을 주입하여 사용 가능
- 다른 빈을 활용 가능하기에 인증, 권한 등을 구현
Filter를 설정하는 방법은 두가지로 나뉜다.
방법1) FilterRegistrationBean
FilterRegistrationBean으로 필터 등록자바 프로그래밍 방식으로 FilterRegistrationBean을 이용해서 필터로 등록한 후에 WebMvcConfigurer을 상속 받아 설정 후 빈으로 등록하는 방식
소스 코드
public class CORSFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("===========Filter-Init============");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
System.out.println("===========doFilter============");
chain.doFilter(req, res);
}
@Override
public void destroy() {
System.out.println("===========Filter-Destroy============");
}
}
Filter를 Implements한 원하는 필터 Class를 만든다.
해당 필터에서 필요한 로직을 구현한다.
@Configuration
public class WebConfig 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;
}
}
첫번째로 @Bean으로 해당 메서드를 Spring에서 관리하는 아이로 만든다.
그다음 FilterRegistrationBean에 내가 만든 Filter를 등록시킨다.
방법2) @WebFilter 어노테이션
필터 등록내장 컨테이너를 사용하는 스프링부트에서 지원하는 어노테이션인 @WebServlet, @WebFilter 및 @WebListener 선언해서 자동 등록 후 @ServletComponentScan로 이용하는 방식
소스 코드
@WebFilter(urlPatterns = "/*")
public class WebFilterConfig implements Filter{
private FilterConfig filterConfig = null;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
this.filterConfig = filterConfig;
System.out.println("===========Filter-Init============");
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession();
//접속 경로
System.out.println("===========doFilter============");
chain.doFilter(req, res);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("===========Filter-Destroy============");
}
}
다른 점은 @WebFilter 어노테이션으로 끝냈다는것이다.
어노테이션 뒤에 urlPattern을 지정하여 Filter를 통과시키고싶은 url들을 지정해서 사용하면 된다.
'SpringBoot' 카테고리의 다른 글
[SpringBoot] Spring Batch 개념과 간단 예제 -1 (0) | 2022.07.12 |
---|---|
[SpringBoot] DI 주입하는 방법 + 롬복 이용 (0) | 2021.08.24 |
[SpringBoot] Spring boot에서 간단한 Redis 설정 및 사용 예제 (0) | 2021.08.06 |
[SpringBoot] Driver 오류 Failed to configure a DataSource (0) | 2021.05.31 |
[SpringBoot] Spring Boot 개념 및 시작하기-1 (0) | 2021.03.12 |