Filter란 쉽게 말해서 서블릿(정확히는 Dispatcher Servlet)에 요청이 전달되기 이전에 거치는 서블릿으로 모든 요청과 응답에 대해서 부가적인 작업을 처리하기 위해 존재한다. 예를 들어 로그인 상태를 확인하거나 문자 인코딩을 하는 등 주로 인증과 권한을 체크하는 것에 주로 쓰이게 된다.
또한 필터를 아래의 그림과 같이 여러 개 사용할 수 있는데, 이를 필터 체인(FiterChain)이라고 부른다.
public class CharacterEncodingFilter implements Filter {
FilterConfig config;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.config = filterConfig;
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding(config.getInitParameter("encoding"));
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() { }
}
다른 서블릿들과 같이 init
, doFilter
, destroy
메소드로 구성되어 있고, init
과 destroy
메서드는 각각 한 번씩만 호출된다.
doFilter
메서드는 service
메서드처럼 여러 번 실행 가능하고, 필터와 매핑된 URL의 요청이 들어올 때마다 호출된다. 위의 코드처럼 doFilter
메서드를 호출해야 다음 필터가 호출되거나, 다음 필터가 없다면 서블릿의 service
메서드가 호출된다.
인터셉터는 필터와 달리 Spring이 제공하는 기술로, 디스패처 서블릿(Dispatcher Servlet)을 지나 컨트롤러(Controller)를 호출하기 전과 후에 요청과 응답을 가공하게 된다.
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception { return true; }
default void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, @Nullable ModelAndView modelAndView) throws Exception { }
default void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, @Nullable Exception ex) throws Exception { }
}
인터셉터를 추가하기 위해서는 필터와 마찬가지로 HandlerInterceptor 인터페이스를 구현(implements)해줘야만 한다.
preHandle
메소드postHandle
메소드afterCompletion
메소드Link
https://atoz-develop.tistory.com/entry/Servlet-Filter-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0,
https://mangkyu.tistory.com/173,
https://sgcomputer.tistory.com/238,
https://pangtrue.tistory.com/249,