포스트

Filter and Listener

Filter and Listener

Filter & Listener

  • 필터와 리스너를 이용하면 JSP와 서블릿 같은 동적 자원에서 개별적으로 처리해야 하던 업무를 일괄로 처리 가능
  • 필터를 활용하는 대표적인 예로는 한글 인코딩 처리가 있음
  • 리스너는 웹 애플리케이션이나 세션의 시작과 종료 이벤트를 먼저 감지하여 최종 리소스(HTML, JSP, Servlet 등)에서 이벤트별로 특정한 처리를 일괄로 수행 가능

Filter

  • 웹 컨테이너의 ‘전면’에서 클라이언트와 주고받는 메시지를 처리
  • 클라이언트가 요청을 보내면 JSP나 서블릿이 받기 전에 필터를 거침
  • 웹 서버가 응답할 때도 마찬가지로 필터를 거쳐 클라이언트로 전달
  • 즉, 요청 정보에 특정한 처리를 미리 적용(전처리)하거나 응답 내용을 변경 혹은 취소(후처리)할 수 있음

Filter interface

  • jakarta.servlet.Filter 인터페이스를 구현(Implements)하여 사용
메서드명설명필수 여부
init()필터를 초기화할 때 호출X
doFilter()필터를 리소스에 적용할 때마다 호출O
destroy()필터가 소멸될 때 호출X

init() 메서드

  • 웹 컨테이너가 필터를 초기화할 때 딱 한 번 호출
  • 디폴트 메서드이므로 만약 필터 생성 시 별도로 초기화할 내용이 없다면 오버라이딩하지 않아도 됨
  • 매개변수로 받는 FilterConfig로는 web.xml에 정의한 초기화 매개변수를 읽어올 수 있음
1
2
public void init(FilterConfig filterConfig) {
}
메서드명설명
getFilterName()필터 매핑 시 지정한 필터명을 반환
<filter-name>요소로 지정
getInitParameter(String name)해당 필터에 지정한 초기화 매개변수의 값을 읽어옴
<init-param>요소로 지정
getInitParameterNames()해당 필터에 지정한 모든 초기화 매개변수의 이름을 반환
반환 타입은 Enumeration<String>
getServletContext()application 내장 객체의 타입인 ServletContext를 반환
서블릿 컨텍스트는 웹 애플리케이션의 정보를 가지고 있음

doFilter() 메서드

  • 클라이언트의 요청을 리소스에 적용할 때마다 호출
1
2
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
}

ServletRequest : 요청 정보를 저장한 객체
ServletResponse : 응답 정보를 저장한 객체
FilterChain : 다음 필터로 요청을 전달하거나 최종 리소스로 요청을 전달하는 객체

1
2
3
4
5
6
7
8
9
10
11
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;
    String encoding = "UTF-8";
    req.setCharacterEncoding(encoding);
    res.setCharacterEncoding(encoding);
    // 다음 필터(혹은 최종 리소스) 호출
    chain.doFilter(req, res);
}
  1. 요청에 대해 원하는 전처리 실행
  2. 매개변수로 받은 FilterChain 객체의 doFilter() 메서드를 호출. 이 메서드는 필터 체인에서 다음 필터를 호출하거나, 지금 마지막 필터라면 최종 리소스를 호출
  3. 다음 필터의 처리 결과 혹은 최종 리소스를 받아 후처리. request와 response 객체는 필터 체인의 모든 필터에 전달되어 공유

destroy() 메서드

  • 필터가 종료될 때 딱 한 번 호출되어 필터를 통해 열었던 리소스를 닫음
  • 디폴트 메서드이므로 만약 필터 생성 시 별도로 종료할 내용이 없다면 오버라이딩하지 않아도 됨
1
2
public void destroy() {
}

web.xml에 필터 매핑하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 필터로 사용할 클래스
public class 필터클래스명 implements Filter {
    // 실행할 코드;
}

// web.xml
<filter>
    <filter-name>필터명</filter-name>
    <filter-class>
패키지를 포함한
필터 클래스명</filter-class>
    <init-param>
        <param-name>
초기화 매개변수명</param-name>
        <param-value>
초기화 매개변수값</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>필터명</filter-name>
    <url-pattern>
필터를 적용할
URL 패턴</url-pattern>
</filter-mapping>

Annotation을 이용한 필터 매핑

1
2
3
4
5
6
7
8
9
10
11
// 매핑할 요청명이 1개인 경우
@WebFilter(filterName = "필터명", urlPatterns = "/요청명")
public class 필터클래스명 implements Filter {
    // 실행할 코드;
}

// 매핑할 요청명이 2개 이상인 경우
@WebFilter(filterName = "필터명", urlPatterns = {"/요청명1", "/요청명2"})
public class 필터클래스명 implements Filter {
    // 실행할 코드;
}

Listener

  • 웹 어플리케이션에서 발생하는 다양한 이벤트를 맡아 처리해주는 역할
  • 주요 이벤트로는 웹 애플리케이션의 시작과 종료, 세션의 생성과 소멸, 속성의 추가와 제거 등이 있음

EventListener

이벤트 소스이벤트 리스너설명
ServletContextServletContextListener웹 애플리케이션의 시작과 종료시 발생하는 이벤트를 처리(감지)
 ServletContextAttributeListener웹 애플리케이션의 속성 추가와 수정, 제거시 발생하는 이벤트를 처리(감지)
HttpSessionHttpSessionListener세션의 생성(시작)과 소멸(종료) 이벤트를 처리(감지)
 HttpSessionAttributeListenersession 내장 객체를 통해 속성을 추가, 수정, 삭제할 때 발생하는 이벤트 감지
ServletRequestServletRequestListener클라이언트의 요청 및 서버의 응답 시 ServletRequest 객체의 생성 및 제거 이벤트 감지
 ServletRequestAttributeListenerServletRequest 객체에 속성을 추가, 수정, 제거할 때 발생하는 이벤트 감지
이 기사는 저작권자의 CC BY-NC 4.0 라이센스를 따릅니다.