스터디 모음/Web 스터디

[Web] 서블릿 필터 - 서블릿 실행 전, 후에 특별한 작업 수행하기 (javax.servlet.Filter)

always-dev 2022. 8. 11.
반응형

 

 

 

 

 

개요

 

필터라고 많이 들어보시지 않았나요 ?

서블릿 필터는 서블릿 실행 전후에 어떤 특별한 작업을 하고자 할 때 사용합니다.

 

예를 들어보겠습니다.

저희가 서블릿을 직접 구현 했을 때 한글 인코딩을 위해서 setCharacterEncoding(”UTF-8”) 을 계속해서 집어넣어 줬습니다.

이 작업을 getParameter()로 데이터를 꺼내기 전에 실행시켜 줬습니다.

 

“데이터를 꺼내기 전" 이라는 시점에 “인코딩"이라는 특별한 작업을 해야하는 상황입니다.

 

저희는 이를 대신해줄 필터를 만들어서 설정하겠습니다.

 

요약하자면

Filter 인터페이스를 구현하고 DD파일이나 애노테이션으로 설정해두면 됩니다.

 

 

 

 

 

 

 

Filter 인터페이스 구현체 만들기

먼저 javax.servlet.Filter 인터페이스를 구현합니다.

 

필터는 서블릿같이 한 번 생성되면 서버가 종료되기 전까지 유지됩니다.

 

 

 

 

구현체는 다음과 같습니다.

내용은 개요에서와 같이 인코딩해주는 필터 내용입니다.

public class CharacterEncodingFilter implements Filter {
	
	FilterConfig config;
	
	@Override
	public void init(FilterConfig config) throws ServletException {
		this.config = config;
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain nextFilter)
			throws IOException, ServletException {
		
		request.setCharacterEncoding(config.getInitParameter("encoding"));
		nextFilter.doFilter(request, response);
	}
	
	@Override
	public void destroy() {}

}

 

 

 

 

 

 

 

 

구현체는 어떻게 동작할까요 ?

 

 

 

오버라이드한 메서드 보기

  • init()
    • Servlet 인터페이스의 init()과 같은 용도이비다.
    • 메서드의 매개변수를 보면 FilterConfig 객체 인데 이 객체를 통해 필터 초기화 매개변수의 값을 꺼낼 수 있습니다.
  • doFilter()
    • 필터와 연결된 URL 요청 시 doFilter()가 호출 됩니다.
    • nextFilter.doFilter()는 다음 필터를 호출합니다.
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain nextFilter) throws IOException, ServletException {
    		
    		// 서블릿 실행 전 작업
    			// ...
    
    		// 다음 필터 호출
    			nextFilter.doFilter(request, response);
    		// 호출할 필터 없을 시 서블릿의 service() 호출
    
    		// 서블릿 실행 후, 클라이언트 응답 전 작업
    			// ...
    	}
    
  • destroy()
    • 서블릿 컨테이너는 웹 애플리케이션 종료 전 필터들에서 destroy()를 호출하여 마무리 작업을 합니다.

이러한 작업들을 순서대로 그려 본다면 아래와 같습니다.

 

 

 

 

필터 배치 정보 등록

필터 배치 방법은 두 가지 방법이 있습니다.

  1. DD 파일
  2. 애노테이션

 

 

 

 

1. DD 파일에 배치 정보

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
             <display-name>web04</display-name>


    <!-- 컨텍스트 매개변수 -->
   


<!-- 필터 선언 -->
    <filter>
        <filter-name>CharaterEncodingFilter</filter-name>
        <filter-class>web04.spm.filter.CharaterEncodingFilter</filter-class>

        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>

    <!-- 필터 URL 매핑 -->
    <filter-mapping>
        <filter-name>CharaterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>




    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

이제 서블릿에서 setCharacterEncoding()을 하나하나 직접 작성하지 않아도 정상적으로 수행됨을 알 수 있습니다.

 

 

 

 

 

 

 

2. 애노테이션

@WebFilter 애노테이션을 이용하면됩니다.

Filter 구현체에 애노테이션을 추가하면 됩니다.

@WebFilter(urlPatterns = "/*", initParams = { @WebInitParam(name = "encoding", value = "UTF-8") })
public class CharacterEncodingFilter implements Filter {

	FilterConfig config;
반응형

댓글