WebServer/JSP&Servlet

[Servlet] Filter API

gangintheremark 2023. 8. 10. 17:52
728x90

Filter API는 클라이언트에서 서버로 요청할 때, 서블릿이 요청을 받기 전과 응답하기 전에 특정 작업을 수행할 수 있도록 한다. 즉, 웹 컴포넌트가 실행되기 전의 선처리 작업과 응답되기 전의 후처리 작업을 수행하는 API이다. 다수의 Filter을 체인(chain)으로 묶어서 사용할 수도 있다.

필터 클래스 구현

  • package 지정 필수
  • Filter 인터페이스 구현
  • doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  • 필터 맵핑 (web.xml)

doFilter() 메서드에 실질적으로 필터가 제공할 사전 처리와 사후 처리 로직을 작성한다.

package com.filter;

public class MyFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("요청필터 사전처리 코드 작업");
        chain.doFilter(request, response);
        System.out.println("응답필터 사후처리 코드 작업");
    }

    public void init(FilterConfig fConfig) throws ServletException {
        System.out.println("MyFilter 초기화");
    }
}

필터매핑

web.xml에 작성하는 방법과 어노테이션을 이용하는 방법이 있다.

<!-- web.xml -->
<filter>
    <filter-name>필터클래스명</filter-name>
    <filter-class>패키지 경로를 포함한 필터클래스</filter-class>    
</filter>
<filter-mapping>
    <filter-name>필터 매핑명</filter-name>
    <url-pattern>/디렉토리</url-pattern>
</filter-mapping>
  • <url-pattern> : 클라이언트에서 요청하는 URL 값의 패턴에 따라 서버에 저장된 어떤 웹 컴포넌트가 실행될지 결정
    • 디렉터리 패턴 : /디렉터리
      ( /* 로 지정하면 클라이언트가 요청하는 서블릿과 무관하게 항상 수행 )
    • 확장자 패턴 : *.

테스트

MyFilter.java

package com.filter;

public class MyFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("MyFilter.doFilter 전전전전");
        chain.doFilter(request, response);
        System.out.println("MyFilter.doFilter 후후후후");
    }
}

web.xml

<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.filter.MyFilter</filter-class>    
</filter>
<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/test</url-pattern>
</filter-mapping>

 

※ 주로 POST의 한글처리를 하는request.setCharacterEncoding("utf-8"); 를 사전처리 필터에 작성한다.

728x90