Filter 예제
public class CharacterEncodingFilter implements Filter {
FilterConfig config;
@Override
public void init(FilterConfig filterConfig) throws ServletException{
this.config = filterConfig;
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding(config.getInitParameter("encoding"));
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy(){}
}
init()
init() 메소드는 필터 객체가 생성되고 준비 작업을 위해 딱 한번 호출된다. 서빌릿의 init()과 같은 용도이다. 매개변수는 FilterConfig의 인스턴스이다. 이 인스턴스를 통해 필터 초기화 매개변수의 값을 꺼낼수 있다. 위 코드에서는 doFilter()에서 사용하기 위해 인스턴스 변수 config에 저장한다.
doFilter()
필터와 매핑된 URL에 요청이 들어올때마다 doFilter()가 호출된다. 이 메소드에 필터가 할 작업을 작성한다.
filterChain은 다음 필터를 가리키고 filterChain.doFilter()는 다음 필터를 호출한다. 다음 필터가 없다면 내부적으로 서블릿의 service()를 호출한다.
서블릿이 실행되기 전에 처리할 작업은 filterChain.doFilter() 이전에, 서블릿이 실행된 후에 처리할 작업은 filterChain.doFilter() 이후에 작성한다.
필터의 배치 방법은 web.xml에 설정하는 방법과 annotation에 설정하는 방법이 있다.
web.xml에 배치 정보 설정
<!-- 필터 선언 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.test.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<!-- 필터 URL 매핑 -->
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
: 필터 별칭 설정
: 패키지 이름을 포함한 필터 클래스 작성
: 필터가 사용할 정적 데이터 설정
: 필터를 사용할 URL 매핑
: 필터 별칭 지정
: 필터가 적용되어야 하는 URL 지정. /*와 같이 지정하면 모든 요청에 대해 필터 적용
@WebFilter(
urlPatterns = "/*",
initParams = {
@WebInitParam(name="encoding", value = "UTF-8")
}
)
필터 클래스에 위와 같이 @WebFilter 어노테이션을 추가한다.
urlPatterns에 지정해야 하는 값은 부와 동일하다.
사전 작업(서블릿 실행 전) | 사후 작업(써블릿 실행 후) |
---|---|
문자 집합 설정 | |
압축 해제 | 응답 데이터 압축 |
암호화된 데이터의 복호화 | 응답 데이터 암호화 |
로그 작성 | |
사용자 검증 | |
사용자 권한 확인 |