Servlet Filter

배세훈·2021년 8월 6일
0

Filter란?

  • 필터는 서블릿 실행 전, 후에 어떤 작업을 하고자 할 때 사용한다. 예를 들어 클라이언트가 보낸 데이터의 암호를 해제한다거나, 서블릿이 실행되기 전에 필요한 자원을 미리 준비하거나, 서블릿이 실행될 때마다 로그를 남긴다거나 하는 작업을 필터를 통해 처리할 수 있다.

Filter 예제

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()
    init() 메소드는 필터 객체가 생성되고 준비 작업을 위해 딱 한번 호출된다. 서빌릿의 init()과 같은 용도이다. 매개변수는 FilterConfig의 인스턴스이다. 이 인스턴스를 통해 필터 초기화 매개변수의 값을 꺼낼수 있다. 위 코드에서는 doFilter()에서 사용하기 위해 인스턴스 변수 config에 저장한다.

  • doFilter()
    필터와 매핑된 URL에 요청이 들어올때마다 doFilter()가 호출된다. 이 메소드에 필터가 할 작업을 작성한다.
    filterChain은 다음 필터를 가리키고 filterChain.doFilter()는 다음 필터를 호출한다. 다음 필터가 없다면 내부적으로 서블릿의 service()를 호출한다.

서블릿이 실행되기 전에 처리할 작업은 filterChain.doFilter() 이전에, 서블릿이 실행된 후에 처리할 작업은 filterChain.doFilter() 이후에 작성한다.

  • destroy()
    서블릿 컨테이너는 웹 어플리케이션을 종료하기 전에 필터들에 대해 destory()를 호출해서 마무리 작업을 한다.

필터의 구동 과정

  1. 서블릿 컨테이너는 웹 어플리케이션을 시작할 때 DD파일(web.xml)에 등록된 필터의 인스턴스를 생성하고 init()을 호출한다.
  2. 클라이언트 요청이 들어오면 해당하는 필터의 doFilter()를 호출한다.
  3. doFilter()에서 작업을 실행하고 다음 필터의 doFilter()를 호출한다.
  4. 마지막 필터까지 3을 반복한다.
  5. 마지막 필터는 서블릿의 service()를 호출한다.
  6. 서블릿의 service()가 끝나면 service()를 호출했던 이전 필터로 돌아간다.
  7. 반복해서 제일 처음 호출됬던 필터까지 돌아간다.
  8. 마지막으로 클라이언트에게 응답 결과를 보낸다.

필터 배치(Deployment)

필터의 배치 방법은 web.xml에 설정하는 방법과 annotation에 설정하는 방법이 있다.

web.xml에 배치 정보 설정

<!-- 필터 선언 -->
<filter>
	<filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.test.CharacterEncodingFilter</filter-class>
    <init-param>
    	<param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>

<!-- 필터 URL 매핑 -->
<filter-mapping>
	<filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

: 필터 별칭 설정
: 패키지 이름을 포함한 필터 클래스 작성
: 필터가 사용할 정적 데이터 설정
: 필터를 사용할 URL 매핑
: 필터 별칭 지정
: 필터가 적용되어야 하는 URL 지정. /*와 같이 지정하면 모든 요청에 대해 필터 적용

어노테이션에 배치 정보 설정

@WebFilter(
urlPatterns = "/*",
initParams = {
@WebInitParam(name="encoding", value = "UTF-8")
}
)

필터 클래스에 위와 같이 @WebFilter 어노테이션을 추가한다.

urlPatterns에 지정해야 하는 값은 부와 동일하다.

필터 예시

사전 작업(서블릿 실행 전) 사후 작업(써블릿 실행 후)
문자 집합 설정
압축 해제 응답 데이터 압축
암호화된 데이터의 복호화 응답 데이터 암호화
로그 작성
사용자 검증
사용자 권한 확인
profile
성장형 인간

0개의 댓글