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);
}
- 요청에 대해 원하는 전처리 실행
- 매개변수로 받은 FilterChain 객체의 doFilter() 메서드를 호출. 이 메서드는 필터 체인에서 다음 필터를 호출하거나, 지금 마지막 필터라면 최종 리소스를 호출
- 다음 필터의 처리 결과 혹은 최종 리소스를 받아 후처리. 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
| 이벤트 소스 | 이벤트 리스너 | 설명 |
|---|---|---|
| ServletContext | ServletContextListener | 웹 애플리케이션의 시작과 종료시 발생하는 이벤트를 처리(감지) |
| ServletContextAttributeListener | 웹 애플리케이션의 속성 추가와 수정, 제거시 발생하는 이벤트를 처리(감지) | |
| HttpSession | HttpSessionListener | 세션의 생성(시작)과 소멸(종료) 이벤트를 처리(감지) |
| HttpSessionAttributeListener | session 내장 객체를 통해 속성을 추가, 수정, 삭제할 때 발생하는 이벤트 감지 | |
| ServletRequest | ServletRequestListener | 클라이언트의 요청 및 서버의 응답 시 ServletRequest 객체의 생성 및 제거 이벤트 감지 |
| ServletRequestAttributeListener | ServletRequest 객체에 속성을 추가, 수정, 제거할 때 발생하는 이벤트 감지 |
이 기사는 저작권자의 CC BY-NC 4.0 라이센스를 따릅니다.