필터체인(FilterChain)
하나의 웹 어플리케이션에는 여러개의 필터가 존재할 수 있습니다

웹 어플리케이션에 생성된 여러개의 필터 객체들은 순서를 가지고 서로 사슬처럼 연결되어 있기에 이것을 필터체인(FilterChain)이라고 합니다. 필터체인의 가장 끝에는 최종 목적지(Servlet, JSP, 기타 자원)가 있습니다.

필터 클래스에서 구현한 doFilter() 메서드의 세번째 파라미터로 FilterChain이 넘어오는데 이 FilterChain이 이 필터사슬과 관련된 객체입니다. 따라서 FilterChain의 doFilter() 메서드를 실행하면 필터체인상에 있는 다음 컴포넌트로 제어가 넘어갑니다.
    public void doFilter(ServletRequest request, ServletResponse  response, FilterChain chain)
            throws IOException, ServletException {
        
        chain.doFilter(request, response); //체인상의 다음 컴포넌트로 요청과 응답 객체를 넘김
        
    }
cs

추가적으로 요청이나 응답정보를 변경하게 되면 필터체인상의 이전 순서의 필터나 다음 순서의 필터에 변경된채로 전달되게 됩니다.



필터를 여러개 등록하는 방법
필터를 여러개 등록하는 방법은 별다른게 없고 web.xml에 <filter>태그를 여러번 사용해 각각의 필터를 등록하면 됩니다.
      <filter>
            <filter-name>firstFilter</filter-name>
            <filter-class>test.FirstFilter</filter-class>
      </filter>
      <filter>
            <filter-name>secondFilter</filter-name>
            <filter-class>test.SecondFilter</filter-class>
      </filter>
cs




필터 순서 지정
필터체인에 여러개의 필터들이 존재하는 경우 순서가 보장되어야 하는 경우가 있을 수 있습니다. 기본적으로 서블릿 컨테이너는 서버 시작시 web.xml 설정을 위에서 아래로 읽어들일때 <filer-mapping>이 정의된 순서를 기준으로 필터체인의 정렬 순서를 정의합니다. 따라서 다음과 같이 설정하는 경우 firstFilter -> thirdFilter 순서로 필터체인이 형성됩니다.
<filer-mapping>
    <filter-name>firstFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filer-mapping>
 
 
<filer-mapping>
    <filter-name>secondFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filer-mapping>
 
 
<filer-mapping>
    <filter-name>thirdFilter</filter-name>
    <url-pattern>/third</url-pattern>
</filer-mapping>
cs


만약 @WebFilter로 필터를 등록했을 경우에 순서에 대해 궁금하신 분은 다음의 링크를 참조해주시면 감사하겠습니다.




필터체인이 달라질 수 있다
필터가 여러개 등록되어 있다고 해서 모든 요청이 필터체인의 모든 필터를 통과하는것은 아닙니다. 만약 방금 전의 설정에서 클라이언트가 /third/somthing URL로 요청하는 경우에는 firstFilter -> thirdFilter 순서대로 세개의 필터를 모두 통과하겠지만 /somthing 으로 요청하는 경우에는 세번째 필터를 제외하고 firstFiltersecondFilter만이 순서대로 처리될 것입니다. /somthing은 thirdFilter의 url-pattern인 /third 에는 부합하는 조건이 아니기 때문입니다.





관련글
블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,