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( ) 메소드를 실행하지 못하고 클라이언트에게 응답 처리가 됩니다.