Having

[Servlet/JSP] Servlet Filter와 Event Listener 본문

Web

[Servlet/JSP] Servlet Filter와 Event Listener

GHM 2023. 1. 16. 17:19
  • Filter 정의, 역할, 특징
  • Filter 구현하기
  • Event, Event Listener 정의
  • ServletContextListener
  • Filter VS Listener 

 

필터(Filter)란?

: Java Web Application에서 클라이언트와 servlet간에 HTTP 요청과 응답의 전후처리(필터링)을 수행하는 객체

 

출처: https://j2eetutorials.50webs.com/filters.html

Filter 역할

HTTP 요청의 전처리와 응답의 후처리에 사용되어, 요청과 응답의 정보를 변경하거나 흐름을 제어한다.

또, 여러 servlet의 반복적인 작업(중복 코드)를 하나의 필터에서 일괄 처리한다.

 

Filter Object의 특징

  1. 웹 컨테이너 안에 존재하며, 클라이언트와 리소스(jsp, servlet) 사이에 위치한다.
  2. servlet처럼 웹 컨테이너(= servlet container)에 의해 생성되고 관리된다.
  3. servlet과 비슷한 life cycle을 가진다 (생성 -> 초기화 -> 필터 -> 종료)
  4. 복수의 필터 존재 가능, 필터 체인(chain)을 형성한다 (요청과 응답의 순서가 반대) 

    EX) 위 그림의 Servlet 2 Filter 순서
    요청 순서 : Filter1 -> Filter2 -> Filter3
    응답 순서 : Filter3 -> Filter2 -> Filter1


Filter를 주로 사용하는 기능

  1. 사용자 인증 체크 (비회원 유저의 회원전용 페이지로의 접속을 막는다) 
  2. 요청 로깅 (클라이언트의 요청 및 IP 주소를 추적)
  3. Request param Validation
  4. 데이터 압축 (다운로드 파일의 크기를 압축)
  5. 암호화, 인코딩
  6. cache 필터

 


Filter 구현하기

1. javax.servlet.Filter 인터페이스 구현체 생성 및 doFilter 메서드 오버라이딩

Filter 인터페이스는 3개의 life cycle 메서드를 가진다. 

     a. init(FilterConfig config) : 서블릿 컨테이너가 필터 인스턴스 초기화

     b. doFilter(ServletRequest res, ServletResponse res, FilterChain chain) : 필터 기능 수행

     c. destroy() : 서블릿 컨테이너가 필터 인스턴스 삭제

package com.model2.mvc.common.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class EncodingFilter implements Filter {
	
    private String encoding;
	
	@Override
	public void init(FilterConfig config) throws ServletException {
		encoding = config.getInitParameter(encoding);
		if(encoding == null) encoding = "utf-8";
	}
	
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		request.setCharacterEncoding(encoding);
		chain.doFilter(request, response);
	}
}

 

 

2. Filter 구현체 웹 컨테이너에 등록 (2가지 방법)

web.xml

	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>com.model2.mvc.common.filter.EncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

 

@WebFilter

@WebFilter(filterName = "encodingFilter", initParams = @WebInitParam(name = "encoding", value = "UTF-8"), urlPatterns = "/*")
public class EncodingFilter implements Filter {

	private String encoding;
	
	@Override
	public void init(FilterConfig config) throws ServletException {...}
	
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {...}
}

이벤트(Event)란?

발생한 특정 사건을 의미한다.

일반적으로 이벤트는 마우스 클릭, 키보드 입력 등과 같이 입출력과 관련된 것을 의미하지만,

웹 프로그래밍에서의 이벤트는 웹 애플리케이션 시작과 종료, client의 HTTP 요청, session과 같은 특정 객체의 생성과 소멸 등을 의미한다.

 

이벤트가 발생한 곳을 이벤트 소스라고 한다. 이벤트 소스는 마우스, 키보드, 웹 애플리케이션, client, session 등이 될 수 있다.

 

이벤트 리스너(Event Listener)란?

: 특정 이벤트가 발생하기를 기다리다가 실행되는 메서드, 혹은 그 메서드를 지닌 객체이다. 

이벤트가 발생하면 곧바로 Listener가 실행되기 때문에, 리스너를 이벤트 핸들러라고도 부른다.

 


Servlet Event

서블릿에서의 이벤트는 application-level과 session-level에서의 이벤트로 나뉜다.

1. application-level

이벤트 소스 : ServletContext (=application)

이벤트 리스너 : ServletContextListener

 

2. session-level

이벤트 소스 : HttpSession

이벤트 리스너 : HttpSessionListener

 

ServletContextListener

javax.servlet.ServletContextListener 인터페이스이며, ServletContext와 관련된 리스너이다.
ServletContext는 웹 애플리케이션과 1대1로 연결된 객체이므로,
ServletContextListener는 웹 애플리케이션의 시작과 종료 이벤트를 처리(핸들링)할 수 있는 리스너이다.

 

메서드

  • contextInitialized(ServletContextEvent event) : 웹 애플리케이션 시작 시 호출되는 메서드
  • contextDestroyed(SevletContextEvent event) : 웹 애플리케이션 종료 시 호출되는 메서드

 

Filter 구현과 동일

1. ServletContextListener 인터페이스 구현체 생성 및 메서드 오버라이딩

2. 구현체 웹 컨테이너에 등록 (web.xml에 <listener> 태그 또는 @WebListener)

 


Filter VS Listener

필터는 클라이언트와 서블릿 사이에서 HTTP 요청, 응답의 필터링 작업(doFilter 메서드)를 수행하는 반면

리스너는 요청, 응답과 관계 없이 특정 이벤트와 관련이 있다.

 

 

 


참고

https://dololak.tistory.com/616
https://www.geeksforgeeks.org/java-servlet-filter/?ref=rp