記錄

Servlet) Filter 본문

Web/Servlet

Servlet) Filter

surhommejk 2018. 4. 4. 10:37

필터(Filter)


필터란 서블릿 2.3 버전에 추가된 것으로, 클라이언트의 요청을 서블릿 받기 전에 가로채어 필터에 작성된 내용을 수행하는 것을 말한다. 따라서 필터를 사용하면 클라이언트의 요청을 가로채서 서버 컴포넌트의 추가적인 기능을 수행시킬 수 있다.


필터(Filter)의 기능 – 필터로 할 수 있는 것들


인증(사용자 인증)

로깅 및 감사 필터

이미지 변환

데이터 압축

암호화 필터

토크나이징(Tokenizing) 필터

XML 컨텐츠를 변형하는 XSLT 필터

Mime-Type 체인 필터

URL 및 기타 정보들을 캐시하는 필터



필터 적용 순서


1. 필터 인터페이스를 구현하는 자바 클래스를 생성


2. /WEB-INF/web.xml 에 filter 엘레멘트를 사용하여 필터 클래스를 등록

필터의 라이프 사이클


필터는 서블릿과 비슷한 라이프 사이클을 가지며 생성, 초기화, 필터, 종료의 4단계로 이루어진다. 또한, 서블릿 컨테이너는 필터 객체가 초기화 파라미터에 접근하는데 사용하는 환경설정 객체(FilterConfig)의 레퍼런스를 제공한다.


서블릿 컨테이너가 필터의 init() 메소드를 호출하면 필터 인스턴스는 바로 요청을 처리할 수 있는 상태가 된다. 서블릿이 service() 메소드를 이용해서 요청을 처리한 것처럼 필터는 doFilter() 메소드를 통해서 요청을 처리한다. 모든 요청에 대한 처리가 끝나면 destory() 메소드가 호출되면서 필터는 비활성 상태로 변경된다.



필터 클래스


필터 클래스는 javax.servlet.Filter 인터페이스를 구현해야 한다. Filter 인터페이스는 init(), doFilter(), destroy() 메소드를 정의 되어있으며, 각각의 메소드의 역할을 다음과 같다.


– init(FilterConfig config) : void  throws ServletException

서블릿 컨테이너가 필터 인스턴스를 초기화하기 위해서 호출하는 메소드


– doFilter(ServletRequest req, ServletResponse res, FilterChain chain) : void  throws IOException, ServletException

필터의 로직을 작성하는 메소드


– destroy() : void

필터 인스턴스를 종료시키기 전에 호출하는 메소드


출처 : https://sbsjavaprg.wordpress.com/2014/02/18/%EC%84%9C%EB%B8%94%EB%A6%BF-%ED%95%84%ED%84%B0filter-%EC%84%A4%EB%AA%85-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95/











web.xml

<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>kr.or.kosta.filter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/login/*</url-pattern>
</filter-mapping>







filter


package kr.or.kosta.filter;

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;
import javax.servlet.annotation.WebFilter;

//@WebFilter("/EncodingFilter")
public class EncodingFilter implements Filter {
//member filed
  private String encoding;
  
public EncodingFilter() { }
  public void destroy() { }
  
  public void init(FilterConfig fConfig) throws ServletException {
    //초기화 함수 (한번 실행)
    /* web.xml
      <init-param>
       <param-name>encoding</param-name>
       <param-value>UTF-8</param-value>
      </init-param>
   */
    this.encoding = fConfig.getInitParameter("encoding");
    System.out.println("Filter init : " + this.encoding);
  }

  public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
    //request (요청이 왔을때 처리되는 코드)
    if(request.getCharacterEncoding() == null) {
      System.out.println("Before : " + request.getCharacterEncoding());
      request.setCharacterEncoding(this.encoding);
      System.out.println("after : " + request.getCharacterEncoding());
    }
    chain.doFilter(request, response); //다른 필터를 호출 ....
    //response (응답할때 처리되는 코드)
    System.out.println("respnose 응답 처리");
  }
}


package kr.or.kosta.filter;

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;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;


@WebFilter(
    description = "프로그램 실행시 걸린 시간 체크 필터",
    urlPatterns = { "/*" },
    initParams = {
        @WebInitParam(name = "Time", value = "0", description = "기준시간")
    })
public class TimeFilter implements Filter {

public TimeFilter() {
}

  
  public void destroy() {
  }

  public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
    
    long start = System.currentTimeMillis();
    chain.doFilter(request, response);
    //응답이 나갈때
    long end = System.currentTimeMillis();
    System.out.println("걸린시간 : " + (end - start)/1000F);
    
  }

  public void init(FilterConfig fConfig) throws ServletException {
  }

}



cf) 모든 필터의 chain.doFilter(request, response) 이전의 모든 로직을 실행하고 나서 chain.doFilter() 이후의 로직을 처리. Filter들이 체인처럼 엮여있다

'Web > Servlet' 카테고리의 다른 글

Servlet) 파일 업로드  (0) 2018.04.04
Servlet) "?cmd=~" vs @WebServlet("*.do")  (0) 2018.04.03
Servlet) 커넥션 풀(DBCP)  (0) 2018.03.29
Servlet) 예제(단순 알림 or 객체 전달)  (0) 2018.03.29
Servlet) out.print()에 대한 이해  (0) 2018.03.29
Comments