728x90
Filter
Filter란 Servlet과 브라우저 간에 요청이나 응답이 이루어질 때 특정 기능을 부여하기 위해 사용합니다. 이는 여러 서블릿에서 반복적으로 수행해야 하는 작업을 공통으로 처리할 수 있습니다. 서블릿 컨테이너가 구동되는 시점에 생성됩니다. 대표적인 기능은 Encoding이 있습니다.
Filter 구동 순서
- 서블릿 컨테이너는 웹 어플리케이션을 시작할 때 web.xml에 등록된 필터의 인스턴스를 생성하고 init()을 호출한다.
- 클라이언트 요청이 들어오면 해당하는 필터의 doFilter()를 호출한다.
- doFilter()에서 작업을 실행하고 다음 필터의 doFilter()를 호출한다.
- 마지막 필터까지 3을 반복한다.
- 마지막 필터는 서블릿의 service()를 호출한다.
- 서블릿의 service()가 끝나면 service()를 호출했던 이전 필터로 돌아간다.
- 반복해서 제일 처음 호출됐던 필터까지 돌아간다.
- 마지막으로 클라이언트에게 응답 결과를 보낸다.
Filter 메서드
- init()
- doFilter()
- destroy()
init()
init() 메서드는 필터 객체가 생성되고 준비 작업을 위해 딱 한번 호출됩니다. 서블릿의 init()과 같은 용도입니다. 이 메서드의 매개변수는 FilterConfig의 인스턴스입니다. 이 인스턴스를 통해 필터 초기화 매개변수의 값을 꺼낼 수 있습니다.
doFilter()
필터와 매핑된 URL에 요청이 들어올 때 마다 doFilter()가 호출됩니다. 이 메서드에 필터가 할 작업을 작성합니다. filterChain은 다음 필터를 가리키고 filterChain.doFilter()는 다음 필터를 호출합니다. 다음 필터가 없으면 내부적으로 서블릿의 service()를 호출합니다.
서블릿이 실행되기 전에 처리할 작업은 filterChain.doFilter() 이전에, 서블릿이 실행된 후에 처리할 작업은 filterChain.doFilter() 이후에 작성합니다.
destroy()
서블릿 컨테이너는 웹 어플리케이션을 종료하기 전에 필터들에 대해 destory()를 호출해서 마무리 작업을 합니다.
Filter 적용 예시
사전 작업(서블릿 실행 전) | 사후 작업(서블릿 실행 후) |
문자 집합 설정 | 응답 데이터 압출 |
압축 해제 | 응답 데이터 암호화 |
암호화된 데이터의 복호화 | 응답 데이터 형식 변환 |
로그 작성 | |
사용자 검증 | |
사용자 권한 확인 |
실습
인코딩 Filter
package controller;
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;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpFilter;
@WebFilter("*.jsp")
public class EncFilter extends HttpFilter implements Filter {
private String encoding;
public EncFilter() {
super();
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding(this.encoding);
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
this.encoding=fConfig.getServletContext().getInitParameter("encoding");
}
}
EncFilter.java
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
</web-app>
web.xml
GitHub
https://github.com/Qkrwnsgus0522/JSP
728x90