Java Servlet Spec 2.3 부터 지원되는 필터는 request 또는 response 에 포함된 정보를 변형하거나 사용하기 위해 사용됩니다.
필터 사용의 가장 큰 이득은 반복적인 작업을 재사용 가능한 단위로 캡슐화 할 수 있는 것입니다.
필터를 사용하여 다음과 같이 다양한 형태의 기능들을 수행할 수 있습니다.
-
사용자 정보를 근거로 요청 인증 및 요청 차단
-
웹 어플리케이션의 유저 작업 추적(로깅 및 감사)
-
Data compression
-
Localization
-
XLST 를 사용하여 XML 데이터의 변형
-
Encryption
-
mime-type 변경
-
Caching
Filter API 구성
-
javax.servlet.Filter Interface
filter 는 Filter 인터페이스를 구현하는 것으로서 정의됩니다. -
javax.servlet.FilterChain Interface
filter chain 은 필터 통과 및 필터 시리즈를 호출하기 위한 수단을 제공합니다. -
javax.servlet.FilterConfig Interface
filter config 는 초기화 데이터를 가지고 있습니다.
Programming Filter
Filter 인터페이스에서 가장 중요한 메서드는 doFilter() 입니다.
doFilter() 내에서 다음과 같은 작업들을 수행하도록 구현합니다.
- request 헤더 검사
- request 헤더 또는 데이터의 변경 및 request 차단
- response 헤덩 또는 데이터의 변경
- filter chain 에서 다음 필터 호출
- chain 에서 다음 필터가 호출된 이후에 response 헤더 검사
- 처리 과정 중에 발생한 에러의 Exception 을 throw
그리고 Filter 인터페이스의 init(), destory() 메서드를 구현해야 합니다.
init() 메서드는 필터가 인스터스화 되어 될 때 컨테이너에 의해서 호출됩니다.
초기화 파라미터를 전달하기 위해서는 FilterConfig 에서 초기화 파라미터를 검색하여 init 에 전달합니다.
Example: Request Character Encoding
많은 브라우저들이 HTTP request 의 Content-Type 헤더에서 character encoding 정보를 보내지 않습니다.
클라이언트 요청에 character encoding 이 설정되어 있지 않으면, 컨테이너는 default encoding 을 사용하여 request parameter 를 파싱합니다.
클라이언트가 character encoding 을 설정하지 않고 request parameter 가 컨테이너의 기본 character encoding 이 아닌 다른 encoding 으로 되었으면 파라미터 값은 올바르게 파싱되지 않습니다.
이번 샘플은 필터를 사용하여 모든 request 에 강제적으로 올바른 character encoding 을 설정하는 방법을 제공합니다.
[SetCharacterEncodingFilter.java]
package filters;
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 SetCharacterEncodingFilter implements Filter {
protected String encoding = null;protected FilterConfig filterConfig = null;
protected boolean ignore = true;
public void destroy() {this.encoding = null;
this.filterConfig = null;}
// Servlet은 chain.doFilter() 기준으로 실행전과 실행후로 나뉜다.
// chain.doFilter() 이전은 Servlet 실행 전 이후는 Servlet 실행 후로 request와 response를 설정.
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {// Conditionally select and set the character encoding to be used
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}// Pass control on to the next filter
chain.doFilter(request, response);}
public void init(FilterConfig filterConfig) throws ServletException {this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding"); // web.xml 내의 필터 설정값 구함
String value = filterConfig.getInitParameter("ignore");
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase("true"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;}
protected String selectEncoding(ServletRequest request) {return (this.encoding);
}
}
[web.xml]
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>EUC_KR</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
출처 : http://blog.naver.com/dalbong97?Redirect=Log&logNo=130026519237 그리고 약간편집
'Java > Java for the Web' 카테고리의 다른 글
A Simple Filter (0) | 2013.02.12 |
---|---|
Cookie정보 보기 (0) | 2013.02.12 |
Session정보 보기 (0) | 2013.02.12 |
Hello Servlet (0) | 2013.02.12 |
SSL 통신원리 (0) | 2013.02.03 |