본문 바로가기
Backend/Servlet & JSP

[Servlet & JSP] 서블릿 filter

by Forsaken Developer 2023. 5. 25.
728x90
728x90

서블릿 filter

서블릿 필터는 요청이 들어올 때마다 요청을 가로채고 사전에 정의한 작업을 수행하고 그 결과를 다음 필터 또는 서블릿에 전달하는 역할을 한다.

필터는 여러 개를 사용할 수 있으며 서블릿을 호출하기 직전이나 직후에 처리해야할 공통된 로직을 필터를 통해서 처리한다.

@WebFilter("/filter/*")
public class TestFilter implements Filter {

	public TestFilter() {
		System.out.println("생성자");
	}
	
	public void init(FilterConfig fConfig) throws ServletException {
		System.out.println("init");
	}
	
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {

		System.out.println("doFilter start");
		chain.doFilter(request, response);
		System.out.println("doFilter end");
	}

	public void destroy() {
		System.out.println("destroy");
	}
}

Filter라는 인터페이스를 상속받아 사용할 수 있으며 servlet처럼 생명주기가 존재한다.

init과 destroy는 default 메소드이기 때문에 오버라이딩이 강제되지 않으므로 필수적으로 생성하지 않아도 된다.

그러나 doFilter 메소드는 추상 메소드로 되어 있기때문에 필수로 구현해야한다.

톰캣이 로드 될 때 모든 필터 인스턴스는 생성되고 init메소드는 인스턴스가 생성되는 시점에 호출된다.

필터의 설정내용이 있다면 FilterConfig 타입의 객체로 설정을 전달한다.

chain.doFilter는 다음 필터를 호출하는 메소드로 다음 필터가 없다면 서블릿을 호출한다.

이 메소드를 기준으로 서블릿 호출 전에 전처리 내용과 서블릿 수행 후 응답 받기 전의 후처리 내용을 작성한다.

인스턴스가 제거되는 시점에 filter destroy가 호출된다.

 

public class EncodingFilter implements Filter {
	
	private String encodingType;
	
	@Override
	public void init(FilterConfig config) {
		encodingType = config.getInitParameter("encoding-type");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
		String method = ((HttpServletRequest)request).getMethod();
		
		if("POST".equals(method)) {
			request.setCharacterEncoding(encodingType);
		}
		
		chain.doFilter(request, response);
	}
}

필터에서는 인코딩, 암호화, 인증, 이미지 리사이징 등의 처리가 가능하다.

위 코드는 인코딩 처리에 대한 예시로 요청의 method type을 확인하여 POST일 경우에 UTF-8로 인코딩 타입을 설정한다.

필터에 대한 mapping 역시 어노테이션 방식이 아닌 xml 방식도 가능하다.

filter name에 필터의 별칭을 설정하고 filter class에 full class명을 설정한다.

filter-mapping에서 설정한 필터의 별칭과 요청 url을 설정 할 수 있고 여기까지는 servlet 설정과 비슷하다.

filter에서는 init-param에 필터가 생성될 때 사용될 때 사용할 수 있는 FilterConfig를 설정할 수 있다.

728x90
반응형

댓글