이전 글에서 Filter는 요청에 의해서 실행될 Servlet 실행 전/후로 특별한 처리가 필요한 경우 실행되는 클래스라고 했다.
즉, 클라이언트의 HTTP 요청이 Servlet에 도달하기 전이나 후에 요청/응답 데이터를 가로채어 변경하거나 처리하는 클래스인 것이다.
그렇다면, Filter 등록하는 방법에 대해 알아보자.
web.xml파일을 이용하여 Filter를 등록할 수 있다.
웹 애플리케이션에서 사용할 Filter 클래스를 작성합니다.
public class LoggingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 필터 초기화 코드
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 필터 동작 코드 (전처리)
System.out.println("Request received at " + System.currentTimeMillis());
// 다음 필터로 체인 전달 또는 실제 서블릿 호출
chain.doFilter(request, response);
// 필터 동작 코드 (후처리)
System.out.println("Response sent at " + System.currentTimeMillis());
}
@Override
public void destroy() {
// 필터 소멸 코드
}
}
<!-- web.xml -->
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 필터 등록 -->
<filter>
<filter-name>LoggingFilter</filter-name>
<filter-class>com.example.LoggingFilter</filter-class>
</filter>
<!-- 필터 매핑 -->
<filter-mapping>
<filter-name>LoggingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
<filter>
태그는 필터를 등록하는 부분이며, <filter-name>
태그는 필터의 이름을 지정한다. 이때, 고유한 이름으로 등록해야한다.
그리고<filter-class>
태그는 등록하기 위해 작성한 필터 클래스의 패키지 전체 경로를 정확하게 작성해야한다.
하지만 listener와 동일하게 지금까지 설명한 코드는 사용하기 위해 filter를 등록하기만 한 것으로 웹 애플리케이션 서버가 언제 실행해야할지 매핑정보를 입력해주어야한다.
따라서, <filter-mapping>
태그 내 <filter-name>
태그는 필터 등록 시 작성한 <filter-name>
과 동일한 값으로 작성해주고, <url-pattern>
태그를 이용하여 필터와 URL을 매핑할 경로를 작성해주어야한다.
어노테이션을 이용하여 Filter를 등록하기 위해서는 @WebFilter
어노테이션을 이용할 수 있다.
해당 어노테이션을 통해서 URL 패턴을 지정하여 사용할 수 있다.
그리고 어노테이션을 이용하여 등록하는 방법은 Servlet3.0 스펙 이후부터 사용할 수 있다.
@WebFilter("/*")
public class LoggingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 필터 초기화 코드
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 필터 동작 코드 (전처리)
System.out.println("Request received at " + System.currentTimeMillis());
// 다음 필터로 체인 전달 또는 실제 서블릿 호출
chain.doFilter(request, response);
// 필터 동작 코드 (후처리)
System.out.println("Response sent at " + System.currentTimeMillis());
}
@Override
public void destroy() {
// 필터 소멸 코드
}
}
doFilter()
메서드는 Java Servlet API의 Filter 인터페이스를 구현할 때 반드시 구현해야하는 필수 메서드이다.
해당 메서드는 Filter가 클라이언트의 요청과 Servlet의 응답을 가로채어(Servlet에 도달하기전) 처리하는 로직을 구현하는 곳입니다.
아래와 같이 doFilter를 선언 방법할 수 있다.
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException;
ServletRequest request
: 클라이언트의 HTTP 요청과 관련된 정보 및 작업을처리하기 위해 객체ServletResponse response
: Servlet이 생성한 응답을 조작하거나새로 생성하기 위한 객체FilterChain chain
: Filter는 동시에 실행되는 것이 아니라, Chain형태의 구조를 나타내고 있다고 했다.따라서, doFilter가 수행하는 주요 역할을 정리해보자.
이처럼 Filter 인터페이스를 구현하는 클래스는 doFilter 메서드를 반드시 구현해야하며, 필터의 주요 로직은 doFilter메서드 내에서 작성되는 것이다.