Client로 부터 Server로 요청이 들어오기 전에 서블릿을 거쳐서 필터링 하는 것을 서블릿 필터라고 한다.
지금까지 Servlet은 HTTPServletRequest
였다면 Filter는 ServletRequest
이다.
Filter의 ServletRequest
가 더 부모클래스이다.
즉, 공통적인 기능들을 서블릿이 호출되기 전에 수행(전처리)되게 하고 싶거나
서블릿이 호출 되고 난 뒤에 수행(후처리) 하고 싶으면 공통적인 기능들을 서블릿 필터로 구현하면 된다.
필터를 설정하는 FilterConfig
객체, FilterChain
객체와 Filter
객체가 필요하다.
FilterConfig
인터페이스랑 FilterChain
인터페이스를 상속받은 클래스들은 웹컨테이너가 구현해준다.
Filter
를 구현하는데 필요한 건 사용자 정의 필터 클래스는 javax.servlet.Filter 인터페이스를 구현한다. Filter
인터페이스는 init() ,doFilter() ,destroy()
메소드가 있다.
init(FilterConfig config)
- 서블릿 컨테이너가 필터 인스턴스를 초기화 하기 위해서 호출하는 메소드
doFilter(ServletRequest resquest, ServletResponse response, FilterChain chain)
- 필터에서 구현해야 하는 로직을 작성하는 메소드
destory()
- 필터 인스턴스를 종료시키기 전에 호출하는 메소드
필터는 서블릿과 비슷한 라이프사이클을 갖는다. 생성, 초기화, 필터, 종료의 4단계로 이루어지며, 서블릿 컨테이너는 필터 객체가 초기화 파라미터에 접근하는데 사용하는 환경설정 객체(FilterConfig)의 레퍼런스를 제공한다. 서블릿 컨테이너가 필터의 init()메소드를 호출하면 필터 인터페이스는 바로 요청을 처리할 수 있는 상태가 된다.
서블릿이 service() 메소드를 이용해서 요청을 처리한 것 처럼 필터는 doFilter() 메소드를 통해서 요청을 처리하는데, 모든 요청에 대한 처리가 끝나면 destory() 메소드가 호출되면서 필터는 비활성 상태로 변경된다.
필터는 연속적인 작용을 수행한다. 즉 여러 필터들을 체인형식으로 연결된 형태를 의미한다. 필터 객체가 수행해야 할 부분인 doFilter() 메소드로 인자로 전달되는 것이 FilterChain객체 이다. FilterChain 객체는 필터의 수행과정을 연속적으로 하기 위한 방법이다. 웹 컨테이너가 FilterConfig 객체와 함께 FilterChain 인터페이스를 구현한 객체를 생성한다.
@WebFilter("/*")
public class SimpleFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("hello filter");
System.out.println(request.getRemoteHost());
System.out.println(request.getRemoteAddr());
chain.doFilter(request, response);
System.out.println("re hello filter");
}
@Override
public void destroy() {
}
}