필터는 클라이언트와 서블릿 사이에서 전달되는 request와 response를 중간에서 가로채서 특정한 작업을 하게 된다.
모든 request와 response에 적용되어야 하는 작업에 대한 필터링을 해준다. 불필요하게 반복되는 작업을 필터를 통해 적용함으로써 코드를 줄이고 생산성을 높이는 것이다. 예를 들어 문자 인코딩이 있다.
서블릿마다 위와 같은 인코딩을 지정해주어야하는데, 서블릿이 1억개가 있다고 가정한다면, 이것을 1억개마다 다 지정해야하는 것이다.
이 때 필터를 이용하면 이러한 수고를 덜 수 있다.
CharacterEncodingFilter
package com.newlecture.web.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CharacterEncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest request
, ServletResponse response
, FilterChain chain)
throws IOException, ServletException {
System.out.println("before filter");
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response); // 요청이 오면 다음 서블릿 실행된 이후 서블릿에 대한 req,resp를 넘겨받음
System.out.println("after filter");
}
}
위와 같이 어노테이션을 통해 모든 서블릿에 대한 필터링을 할 수 있지만, 아래와 같이 xml을 사용하여 등록할 수도 있다.
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>com.newlecture.web.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>
</web-app>