JSP

필터 - Filter

Sun-Koo 2023. 3. 14. 12:59

클라이언트로부터 서블릿이 요청되어 수행될 때 필터링 기능을 제공하기 위한 기술

 

사용되는 시점

요청된 서블릿이 수행되기 전과 후

 

필터로 구현 가능한 기능

  • 서블릿이 호출되기 전에 서블릿 요청을 가로채는 기능
  • 서블릿이 호출되기 전에 요청 내용을 점검하는 기능
  • 요청 헤더의 수정과 조정 기능
  • 서블릿이 호출된 후에 서블릿 응답을 가로채는 기능
  • 응답 헤더의 수정와 조정가능

필터 기능을 활용하여 처리하는 기능의 대표적인 예시

  • 로그 기록
  • 한글 처리

필터구현하기

javax.servlet.filter 인터페이스를 구현한다

 

init(FilterConfig)

필터 객체가 생성될 때 호출되는 메소드

웹서버가 시작될 때 한번만 되어 생성되어 한번만 호출되며, init( )메소드에는 주로 초기화 기능을 구현

 

doFilter(ServletRequest request, ServletResponse response)

필터링 설정한 서블릿을 실행할 때마다 호출되는 메소드로서 실제 필터링 기능을 구현

 

destory( )

필터 객체가 삭제 될 때 호출되는 메소드

주로 자원 해제 기능을 구현

 

ex )

 

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;
 
public class FlowFilterOne implements Filter {
    String charset;
    /**
     * Default constructor. 
     */
    public FlowFilterOne() {
    }
 
    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        charset = fConfig.getInitParameter("en");
        System.out.println("init() 호출 ......... one");
    }
 
    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // place your code here
        System.out.println("doFilter() 호출  전 ......... one");
        // pass the request along the filter chain
        chain.doFilter(request, response);
        System.out.println("doFilter() 호출  후 ......... one");
    }
 
    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
        System.out.println("destory () 호출 ......... one");
    }
 
}

필터등록

등록하는 방법은 2가지

 

주의할 점

필터를 등록할 때는 한가지 방법으로 선택하여 등록해야 한다.

두 방법 모두를 이용해 필터를 중복하여 등록해서는 안된다

 

web.xml

<filter>
  <filter-name>flow1</filter-name>
  <filter-class>job.study.web.FlowFilterOne</filter-class>
</filter>

애노테이션

@WebFilter(
    filterName="flow2"
)
public class FlowFilterTwo implements Filter {
    .... 생략 ....
}

애노테이션만으로는 필터의 실행순서를 정할 수 없다

web.xml에 정의하고자 하는 실행순서에 따라 필터 맵핑을 순서대로 작성


필터맵핑

<filter-mapping>
  <filter-name>flow1</filter-name>
  <url-pattern>/second</url-pattern>
</filter-mapping>
<filter-mapping>
  <filter-name>flow2</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

 

여러개의 필터가 등록되어 있을 때 실행되는 순서는 필터 맵핑 순으로 실행

 

필터의 순서

  • 클라이언트로부터 요청이 들어오면 /second 로 매핑된 flow1 필터의 doFilter가실행됩니다
  • 그 다음 /*으로 설정하여 모든 웹 애플리케이션 요청에 대해 매핑된 flow2 필터의 doFilter가 실행됩니다.
  • web.xml에 더 이상 만족하는 조건의 필터맵핑이 없으면, 클라이언트가 요청한 서블릿이 실행

 

만약, 마지막으로 수행하는 필터에서 더 이상 필터체인의 doFilter( ) 메소드를 호출하지 않으면

서블릿의 service( ) 메소드를 실행하지 못하고  클라이언트에게 응답 처리가 됩니다.