Servlet Filter

박병주·2023년 1월 8일
0

servlet

목록 보기
7/7

Servlet Filter란?

Client로 부터 Server로 요청이 들어오기 전에 서블릿을 거쳐서 필터링 하는 것을 서블릿 필터라고 한다.

지금까지 Servlet은 HTTPServletRequest였다면 Filter는 ServletRequest이다.
Filter의 ServletRequest가 더 부모클래스이다.

즉, 공통적인 기능들을 서블릿이 호출되기 전에 수행(전처리)되게 하고 싶거나
서블릿이 호출 되고 난 뒤에 수행(후처리) 하고 싶으면 공통적인 기능들을 서블릿 필터로 구현하면 된다.

Filter 인터페이스

필터를 설정하는 FilterConfig 객체, FilterChain 객체와 Filter 객체가 필요하다.
FilterConfig 인터페이스랑 FilterChain 인터페이스를 상속받은 클래스들은 웹컨테이너가 구현해준다.

Filter를 구현하는데 필요한 건 사용자 정의 필터 클래스는 javax.servlet.Filter 인터페이스를 구현한다. Filter 인터페이스는 init() ,doFilter() ,destroy() 메소드가 있다.

init(FilterConfig config)

  • 서블릿 컨테이너가 필터 인스턴스를 초기화 하기 위해서 호출하는 메소드

doFilter(ServletRequest resquest, ServletResponse response, FilterChain chain)

  • 필터에서 구현해야 하는 로직을 작성하는 메소드

destory()

  • 필터 인스턴스를 종료시키기 전에 호출하는 메소드

Filter의 라이프 사이클

필터는 서블릿과 비슷한 라이프사이클을 갖는다. 생성, 초기화, 필터, 종료의 4단계로 이루어지며, 서블릿 컨테이너는 필터 객체가 초기화 파라미터에 접근하는데 사용하는 환경설정 객체(FilterConfig)의 레퍼런스를 제공한다. 서블릿 컨테이너가 필터의 init()메소드를 호출하면 필터 인터페이스는 바로 요청을 처리할 수 있는 상태가 된다.

서블릿이 service() 메소드를 이용해서 요청을 처리한 것 처럼 필터는 doFilter() 메소드를 통해서 요청을 처리하는데, 모든 요청에 대한 처리가 끝나면 destory() 메소드가 호출되면서 필터는 비활성 상태로 변경된다.

FilterChain

필터는 연속적인 작용을 수행한다. 즉 여러 필터들을 체인형식으로 연결된 형태를 의미한다. 필터 객체가 수행해야 할 부분인 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() {
    }
}
  • WebFilter를 이용하여 모든 경로에 필터가 적용되도록 함.
profile
Developer

0개의 댓글