Java/JSP
JSP 6 - 서블릿의 필터 (filter)
veryhi
2022. 1. 8. 04:35
이전 포스트( JSP 5 - form 태그 POST 요청, HttpServletRequest의 메서드 )에서
HttpServletRequest에 존재하는 메서드들을 살펴보았다.
특정 메서드들을 통해 서블릿에 설정을 입힐 수 있는데,
각 서블릿 클래스마다 일일이 지정해줘야 하는 귀찮음이 존재한다.
따라서 filter라는 설정 파일을 통해 이를 일괄, 혹은 선택적으로
적용해주는 방법을 탐구해보자.
요청의 흐름
WAS → request → 필터 → Servlet Container (Servlet 생성) → 필터 → response → WAS
실행 흐름상 필터(filter)는 각각 생성되는 Servlet Container의 외곽에 위치한다.
말 그대로 필터로서 서블릿 이전에 미리 설정을 적용시키는 역할을 한다.
필터링한다고도 한다.
일반적으로 서블릿의 Filter는 interface Filter를 구현한 클래스로 파일을 생성한다.
서블릿에 적용시키는 방식을 살펴보자.
1. xml 설정 파일 사용
# java 파일
package myPackage
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 myFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
System.out.println("필터 초기화");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("myFilter 적용 전");
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
System.out.println("myFilter 적용 후");
}
public void destroy() {
System.out.println("필터 제거");
}
}
chain.doFilter(request, response);
→ request, response에 필터링 설정 적용
# web.xml
<filter-mapping>
<filter-name>내가 정의한 필터 클래스 이름</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
모든 url 영역(/*)에 대하여, 지정한 filter를 적용
2. @ 어노테이션 사용 (초간단해진다.)
# java 파일
package myPackage
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;
@WebFilter("/*")
public class myFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
System.out.println("필터 초기화");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("myFilter 적용 전");
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
System.out.println("myFilter 적용 후");
}
public void destroy() {
System.out.println("필터 제거");
}
}
@WebFilter("/*")에 영역만 String으로 추가해주면 된다.