일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 이진탐색트리
- null
- 오라클 버림 함수
- Servlet
- heap
- trunc(date)
- queue
- 멀티스레드
- stack
- HashMap
- 정렬
- desc
- 프로세스 종료
- 오라클 trunc()
- HDD
- 스케줄 삭제
- web
- ssd
- Git
- netstat
- maven
- ArrayList
- 스레드
- cpu
- git push
- trunc()
- trunc(sysdate)
- RAM
- url
- MAP
- Today
- Total
無테고리 인생살이
[Servlet/JSP] Servlet Filter와 Event Listener 본문
- Filter 정의, 역할, 특징
- Filter 구현하기
- Event, Event Listener 정의
- ServletContextListener
- Filter VS Listener
필터(Filter)란?
: Java Web Application에서 클라이언트와 servlet간에 HTTP 요청과 응답의 전후처리(필터링)을 수행하는 객체
Filter 역할
HTTP 요청의 전처리와 응답의 후처리에 사용되어, 요청과 응답의 정보를 변경하거나 흐름을 제어한다.
또, 여러 servlet의 반복적인 작업(중복 코드)를 하나의 필터에서 일괄 처리한다.
Filter Object의 특징
- 웹 컨테이너 안에 존재하며, 클라이언트와 리소스(jsp, servlet) 사이에 위치한다.
- servlet처럼 웹 컨테이너(= servlet container)에 의해 생성되고 관리된다.
- servlet과 비슷한 life cycle을 가진다 (생성 -> 초기화 -> 필터 -> 종료)
- 복수의 필터 존재 가능, 필터 체인(chain)을 형성한다 (요청과 응답의 순서가 반대)
EX) 위 그림의 Servlet 2 Filter 순서
요청 순서 : Filter1 -> Filter2 -> Filter3
응답 순서 : Filter3 -> Filter2 -> Filter1
Filter를 주로 사용하는 기능
- 사용자 인증 체크 (비회원 유저의 회원전용 페이지로의 접속을 막는다)
- 요청 로깅 (클라이언트의 요청 및 IP 주소를 추적)
- Request param Validation
- 데이터 압축 (다운로드 파일의 크기를 압축)
- 암호화, 인코딩
- 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
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
'Web' 카테고리의 다른 글
[Web 보안] XSS, CSRF, SQL Injection (0) | 2023.02.01 |
---|---|
[Web] URI, URL, URN 차이점과 URL 구조 (0) | 2023.01.17 |
[Servlet/JSP] Servlet이란 무엇이며 어떻게 동작할까? (feat. Servlet Container) (0) | 2023.01.14 |
[Web] 쿠키와 세션은 HTTP의 어떤 특성을 보완하기 위해 생겨났을까? (0) | 2023.01.11 |
[Web] Web application을 이해하고 Web Server와 WAS의 차이를 알아보자. (0) | 2023.01.10 |