이것 저것 개발 공부/Servlet

[Servlet] Servlet Filter 구현 예제와 실전 적용 방법

crushed-taro 2025. 5. 15. 21:44
728x90
반응형

[Servlet] Servlet에서 Request와 Response를 가공하는 가장 좋은 방법 | Wrapper 클래스

1. Servlet Filter

1. Servlet Filter 개요

1. Servlet Filter란

  • jakarta.servlet.Filter Interface를 상속 받아 구현하는 Class이다.
  • HTTP 요청과 응답 사이에서 전달되는 데이터를 가로채어, 서비스에 맞게 변경하고 걸러내는 필터링 작업을 수행한다.

Servlet 사진 1

  • 필터 설정에 따라 해당하는 요청 및 응답 시에 반드시 거쳐야 하며, 비밀번호 암호화 처리, 인코딩 설정 등 공통 관리에 해당하는 기능을 수행할 수 있다.
  • 필터는 인증 필터, 압축 필터, 리소스 접근 트리거 이벤트 필터, 로깅 필터, 이미지 변환 필터, 토크나이져 필터 등 다양하게 활용 가능하다.

 

2. Servlet Filter 처리 내용

  • Request에 대한 처리
    • 보안 관련 사항
    • 요청 header와 body 형식 지정
    • 요청에 대한 log 기록 유지
  • Response에 대한 처리
    • 응답 stream 압축
    • 응답 stream 내용 추가 및 수정
    • 새로운 응답 작성
    +@ : 여러 가지 필터를 연결(= chain, 서로 호출)하여 사용할 수 있다.

 

3. Servlet Filter 동작 구조

Servlet 사진 2

  • 요청 및 응답에 따른 서블릿 수행 전후에 지정한 필터를 거치며 데이터를 가공하는 역할을 한다.

 

4. Servlet Filter 내부 동작

Servlet 사진 3

  • 서블릿의 실행 전후에 동작하므로 서블릿의 service() 메소드 실행 전후에 작동한다.
  • 필터가 여러 개일 경우 stack 방식으로 순차적으로 수행된다.

 

5. Filter Chain (Interface)

  • Filter를 여러 개 사용하는 경우, Filter Chain으로 동작시킬 수 있다.

Servlet 사진 4

  • Chain처럼 서로 연결되어 있는 Filter를 doFilter() 메소드를 이용하여 순차적으로 실행시키는 인터페이스이다.
  • doFilter() 메소드는 chain으로 연결되어 있는 다음 필터 또는 서블릿을 실행하는 메소드이다.
doFilter(ServletRequest req, ServletResponse res);
  • 마지막 필터가 실행된 후에는 service() 메소드를 실행시켜 서블릿의 메소드(= doGet(), doPost())를 실행한다.

 

2. Servlet Filter 사용

1. DD 설정 (= web.xml 설정)

  • Filter를 등록한다.
<filter>
	<filter-name>Filter 설정명</filter-name>
	<filter-class>Filter 구현 Class명</filter-class>
	<init-param> // filter에서 사용한 값 설정
		<param-name>초기값 설정명</param-name>
		<param-value>초기 설정값</param-value>
	</init-param>
</filter>

 

  • url 패턴과 Filter를 mapping한다.
<filter-mapping>
	<filter-name>등록된 Filter명</filter-name>
	<url-pattern>요청할 페이지 형식</url-pattern>
</filter-mapping>

 

  • Filter를 적용할 서블릿을 지정하여, 서블릿과 Filter를 mapping한다.
<filter-mapping>
	<filter-name>등록된 Filter명</filter-name>
	<servlet-name>적용할 Servlet명</servlet-name>
</filter-mapping>

 

2. @WebFilter Annotation 설정

  • Filter 인터페이스를 구현한 클래스 상단에 @WebFilter(url-pattern) 어노테이션을 추가한다.
@WebFilter("/first/*")
public class FirstFilter implements Filter {
	필터 동작 내용
}

 

3. Filter Interface method

  • init (FilterConfig config);
    • 웹 컨테이너가 Filter를 호출하면, init method가 호출되어 Filter 객체를 생성하며 초기화한다.
    • 매개변수 FilterConfig는 web.xml에 있는 <filter>정보를 가지고 있다.
  • doFilter (ServletRequest req, ServletResponse res, FilterChain chain);
    • Filter가 수행될 때 구동하는 method로, 요청 객체와 응답 객체를 사용해 일련의 작업을 수행한 뒤, chain을 통해 가공된 값을 목적지로 전송한다.
  • doFilter (ServletRequest req, ServletResponse res, FilterChain chain);
    • Filter가 수행될 때 구동하는 method로, 요청 객체와 응답 객체를 사용해 일련의 작업을 수행한 뒤, chain을 통해 가공된 값을 목적지로 전송한다.

 

4. Filter Class 작성

public class Class명 implements Filter {
	@Override
	public void init(FilterConfig config) throws ServletException { 
		(Filter 호출 시 작업 설정)
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { 
		(Filtering 작업할 내용)
	}

	@Override
	public void destroy() { 
		(삭제 시 작업 설정)
	}
}

 

5. Filter Class 활용 예시

  • 공통적인 인코딩 설정을 할 CharsetEncodingFilter Class를 작성한다.
import java.io.IOException;

import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;

public class EncodingFilter implements Filter {

    private String encodingType;

    public void destroy() {}

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest hrequest = (HttpServletRequest) request;
        if("POST".equals(hrequest.getMethod())) {
            request.setCharacterEncoding(encodingType);
        }

        chain.doFilter(request, response);
    }

    public void init(FilterConfig fConfig) throws ServletException {
        /* xml 팡리에 init-param을 지정하여 fConfig로 값을 꺼내 사용 */
        encodingType = fConfig.getInitParameter("encoding-type");
    }

}

 

  • web.xml에 필터 및 초기 파라미터 값을 등록한다.
<filter>
    <filter-name>encoding</filter-name>
    <filter-class>com.section02.uses.EncodingFilter</filter-class>
    <init-param>
        <param-name>encoding-type</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
728x90
반응형