Web 애플리케이션에서 관리되는 영역으로 Client로 부터 오는 요청과 응답에 대해 최초/최종 단계의 위치이며 이를 통해 요청과 응답의 정보를 변경하거나 부가적인 기능을 추가할 수 있다.
요청에 대한 인증, 권한 체크 등을 하는데에 쓰인다.
구체적으로 들어온 요청이 DispatcherServlet에 전달되기 전에 헤더를 검사해 인증 토큰이 있는지 없는지, 올바른지 올바르지 않은지 등을 검사할 수 있다.
위 그림은 스프링 프레임워크에서 요청에 대한 라이프 사이클을 나타낸 그림이다.
Filter는 요청이 DispatcherServlet에 의해 다뤄지기 전, 후에 동작한다.
Filter는 한 개만 존재하는 것이 아니라 여러 개가 Chain 형식으로 묶여서 처리될 수 있다.
자원이 받게 되는 요청 정보는 클라이언트와 자원 사이에 존재하는 필터에 의해 변경된 요청정보가 된다.
클라이언트가 보게 되는 응답 정보는 클라이언트와 자원사이에 존재하는 필터에 의해 변경된 응답정보가 된다.
public class FirstFilter implements Filter {}
필터 인터페이스는 3가지 메소드를 갖고 있다.
init()
: 필터가 생성될 때 수행되는 메소드doFilter()
: Request, Response가 필터를 거칠 때 수행되는 메소드destroy()
: 필터가 소멸될 때 수행되는 메소드@Slf4j
public class FirstFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("FirstFilter가 생성 됩니다.");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("==========First 필터 시작!==========");
filterChain.doFilter(servletRequest, servletResponse);
log.info("==========First 필터 종료!==========");
}
@Override
public void destroy() {
log.info("FirstFilter가 사라집니다.");
}
}
@Configuration
public class Config{
@Bean
public FilterRegistrationBean firstFilterRegister() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean(new FirstFilter());
return registrationBean;
}
}
@Slf4j
public class SecondFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("SecondFilter가 생성 됩니다.");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("==========Second 필터 시작!==========");
filterChain.doFilter(servletRequest, servletResponse);
log.info("==========Second 필터 종료!==========");
}
@Override
public void destroy() {
log.info("SecondFilter가 사라집니다.");
}
}
@Configuration
public class Config{
@Bean
public FilterRegistrationBean firstFilterRegister() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean(new FirstFilter());
registrationBean.setOrder(1);
return registrationBean;
}
@Bean
public FilterRegistrationBean secondFilterRegister() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean(new SecondFilter());
registrationBean.setOrder(2);
return registrationBean;
}
}