본문 바로가기
WEB/Servlet, JSP

[Servlet] 필터 (Filter)

by Amy IT 2022. 7. 10.

 

목차

     

    필터(Filter)란?

    클라이언트에서 서블릿으로 요청하고 응답을 처리할 때, 서블릿이 요청 받기 전과 응답 처리 전에 임의의 특정 작업을 수행하도록 Filter API를 사용할 수 있습니다. 즉, 서블릿이 실행되기 전의 선처리 작업과 응답 전의 후처리 작업이 가능합니다. 필터가 수행되는 시점은 요청된 서블릿이 수행되기 전과 후이며, 필터 기능을 사용하여 서블릿의 처리와 유지 보수를 더욱 효과적으로 처리할 수 있습니다. 필터 기능을 활용하여 처리하는 기능 중 대표적인 것이 한글 처리입니다. 필터를 활용하면 여러 페이지에서 수행해야 하는 한글 처리를 한 번의 작업으로 처리할 수 있게 됩니다.

     

    필터 객체의 메소드

    메소드 기능
    init(FilterConfig) 필터 객체 생성시 호출되는 메소드. 필터 객체는 웹 애플리케이션 서비스가 올라가면서, 즉 웹 서버가 시작될 때 한 번만 생성된 다음 계속 재사용되므로 init() 메소드는 서버가 시작될 때 한 번만 호출된다. 따라서 init() 메소드에는 주로 초기화 기능을 구현한다.
    doFilter(ServletRequest, ServletResponse, FilterChain) doFilter() 메소드는 필터링 설정한 서블릿을 실행할 때마다 호출되는 메소드로서, 실제 필터링 기능을 구현하는 메소드이다. 세 번째 인자로 전달되는 FilterChain 객체는 web.xml 파일에서 모든 <filter-mapping> 태그에 관한 정보를 가지고 있다.
    destroy() 필터 객체가 삭제될 때 호출되는 메소드. 따라서 destroy() 메소드에는 주로 자원 해제 기능을 구현한다.

     

    필터 구현

    • 필터 기능을 구현하려면 서블릿과 별도의 클래스로 분리해야 하며, javax.servlet.Filter를 상속받아야 합니다.
    • Filter를 상속받은 필터 클래스의 doFilter 메소드 내에 클라이언트로부터 요청받은 페이지 실행 전이나 후에 필터링할 내용을 구현합니다. 
    • 구현된 필터가 어떤 페이지를 필터링하는지 web.xml 파일에 설정합니다.
    • 필터링이 설정된 페이지가 클라이언트로부터 요청될 때 자동으로 필터 기능이 실행됩니다.

     

    form에서 한글 데이터를 전송해 보겠습니다.

    <!-- test.html -->
    <form action="TestServlet" method="post">
    	<input type="text" name="data">
    	<input type="submit">
    </form>
    @WebServlet("/TestServlet")
    public class TestServlet extends HttpServlet {
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		System.out.println("TestServlet.doGet()"); 
    		String data = request.getParameter("data");
    		System.out.println(data);
    	}
    }

    요청받은 서블릿에서 요청에 대한 한글 처리를 하고 있지 않기 때문에 한글 깨짐 현상이 발생합니다.

     

    이번에는 필터 클래스를 작성하고 web.xml 파일에 필터 설정을 해 보겠습니다.

    public class MyEncodingFilter implements Filter {
    	@Override
    	public void destroy() {
    		System.out.println("MyEncodingFilter.destroy()");
    	}
    	@Override
    	public void init(FilterConfig filterConfig) throws ServletException {
    		System.out.println("MyEncodingFilter.init()"); 
    	}
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    			throws IOException, ServletException {
    		System.out.println("MyEncodingFilter.doFilter() 요청 ========= ");
    		//request 인코딩 설정 
    		request.setCharacterEncoding("utf-8");
    		//chain이 가지고 있는 정보(web.xml에 설정된 매핑 서블릿들)를 근거로 다음에 실행할 메소드를 실행하는 역할
    		chain.doFilter(request, response); 
    		System.out.println("MyEncodingFilter.doFilter() 응답 ========= "); 
    	}
    }
    <!-- web.xml -->
    <filter>
      	<filter-name>MyEncodingFilter</filter-name>
      	<filter-class>com.filter.MyEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
      	<filter-name>MyEncodingFilter</filter-name>
      	<url-pattern>/*</url-pattern> <!-- 모든 주소에 대한 필터 처리 -->
    </filter-mapping>

    처음 test.html 파일 실행시부터 필터 처리가 수행되는 것을 확인할 수 있습니다. 이후 form의 데이터를 제출하여 서블릿에 요청이 갈 때 다시 필터 처리가 되어 한글이 깨지지 않고 출력되고 있습니다.

     

     

     

    참고

    처음 해보는 Servlet&JSP 웹 프로그래밍 (오정임 지음, 루비페이퍼)

     

     

    댓글