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
Posted by Steven J.S Min
,