Search
〰️

Servlet Filter

Servlet Filter

공통 관심 사항

공통 관심사
application 여러 로직에서 공통으로 관심이 있는 것
예) 로그인 여부 Check
동일한 기능이 여러 로직에서 반복됨
향후 관련 로직이 변경될 경우, 동일한 기능을 사용한 모든 곳에서 수정이 필요함
→ 웹과 관련된 공통 관심사는 서블릿 필터 또는 스프링 인터셉터를 사용하는 것이 좋다.
웹과 관련된 공통 관심사를 처리할 때는 HTTP Header나 URL의 정보들이 필요하다.
서블릿 필터나 인터셉터는 HttpServletRequest를 제공한다.

소개

필터는 서블릿이 지원하는 수문장이다!
흐름
http 요청 → WAS → 필터 → Servlet → 컨트롤러
필터를 적용하면 필터가 호출된 다음에 서블릿이 호출된다.
모든 고객의 요청 로그를 남기는 요구사항이 있다면 필터를 사용하면 된다!
필터는 특정 URL 패턴에 적용할 수 있다.
/*이라고 하면 모든 요청에 필터가 적용된다.
스프링을 사용하는 경우 여기서 말하는 서블릿은 스프링의 디스패쳐 서블릿이다.
제한
HTTP 요청 → WAS → 필터 → 서블릿 → 컨트롤러 // 로그인 사용자 HTTP 요청 → WAS → 필터 (적절하지 않은 요청이라 판단, 서블릿 호출 X) // 비 로그인 사용자
필터에서 적절하지 않은 요청이라고 판단하면 거기서 끝을 낼 수도 있다.
로그인 여부를 체크하기에 왕왕 좋다.
체인
HTTP 요청 → WAS → 필터1 → 필터2 → 필터3 → 서블릿 → 컨트롤러
필터는 체인으로 구성되는데, 중간에 필터를 자유롭게 추가할 수 있다.
예를 들어, 로그를 남기는 필터를 먼저 적용하고 그 다음에 로그인 여부를 체크하는 필터를 만들 수 있다.
인터페이스
public interface Filter { public default void init(FilterConfig filterConfig) throws ServletException {} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException; public default void destroy() {} }
Java
복사
필터 인터페이스를 구현하고 등록하면 서블릿 컨테이너가 필터를 싱글톤 객체로 생성하고, 관리한다.
init(): 필터 초기화 메서드, 서블릿 컨테이너가 생성될 때 호출된다.
doFilter(): 고객의 요청이 올 때 마다 해당 메서드가 호출된다. 필터의 로직을 구현하면 된다.
destroy(): 필터 종료 메서드, 서블릿 컨테이너가 종료될 때 호출된다.