필터(filter)이해

 

필터란 ?

- 필터는 클라이언트 요청의 사전 처리 및 후 처리에 호출되는 객체로 요청을 변환하거나, 응답을 변경하는 기능을 수행한다.

- 필터는 주로, 인증, 로깅, 데이터 압축이나 변환, 요청 암호화 및 암호 해독, 입력 유효성 검사 등과 같은 필터링 작업을 수행하는 데 사용된다.

- 하나의 서블릿이나 JSP에 대한 요청이나 응답을 수정해야 하는 경우에는 필터를 만들 필요가 없으며, 여러 개의 서블릿에 대한 요청 및 응답에 사전 처리 또는 사후 처리를 적용하려는 경우에 작성한다.

- request 필터 : 요청(Request)이 백엔드(back end)의 자원(Servlet, JSP 등)에 도달하기 전에 필요한 전 처리를 한다.

- response 필터 : 서버에서 요청(Request)에 대한 처리를 한 후, 클라이언트에 응답(Response)하기 전에 후 처리를 한다.

- 필터들을 여러 개 사용 하면 연쇄적으로 사용할 수도 있다.

 

용도

- request 필터

: 인증 - 사용자 ID를 기반으로 요청을 차단

: 로깅 및 감사 - 웹 응용 프로그램의 사용자 추적(요청정보를 로그파일로 작성)

: 인코딩 작업 등

 

- response 필터

: 데이터 압축 - 다운로드 크기를 줄인다.

: XML 컨텐츠의 XSL/T 변환 (XSL/T : XML 문서를 다른 XML 문서로 변환하는데 사용하는 XML 기반 언어

: 총 서비스 시간측정 등

 

필터(filter) 관련 클래스 및 인터페이스

javax.servlet.Filter 인터페이스

- 필터 클래스는 javax.servlet.Filter 인터페이스를 구현하여 작성한다.

- 필터는 doFilter() 메소드에서 필터링을 수행한다.

- 모든 필터는 초기화 매개 변수를 얻을 수 있는 FilterConfig 객체에 액세스 할 수 있다.

 

javax.servlet.FilterChain 인터페이스 

- FilterChain은 자원에 대한 필터링된 요청의 호출 체인에 대한 뷰를 제공하는 개발자에게 서블릿 컨테이너가 제공하는 객체이다.

- 필터는 FilterChain을 사용하여 체인의 다음 필터를 호출하거나 호출하는 필터가 체인의 마지막 필터인 경우 체인의 끝에 있는 리소스를 호출한다. 

 

javax.servlet.ServletRequestWrapper 클래스

- ServletRequestWrapper 클래스는 ServletRequest 인터페이스에 정의된 모든 메소드를 구현한 클래스

- javax.servlet.http 패키지에 정의된 HttpServletRequestWrapper 클래스는 HttpServletRequest 인터페이스에 정의된 모든 메소드를 구현한 클래스

- ServletRequestWrapper와 HttpServletRequestWrapper 클래스의 메소드 중 변경해야 하는 메소드를 재정의하여 구현하고 필터의 doFilter() 메소드에 넘겨주면, 클라이언트의 요청 정보를 변경할 수 있는 래퍼 클래스이다.

 

javax.servlet.ServletResponseWrapper 클래스

- ServletResponseWrapper 클래스는 ServletResponse 인터페이스에 정의된 모든 메소드를 구현한 클래스

- javax.servlet.http 패키지에 정의된 HttpServletResponseWrapper 클래스는 HttpServletResponse 인터페이스에 정의된 모든 메소드를 구현한 클래스

- ServletResponseWrapper와 HttpServletResponseWrapper 클래스의 메소드 중 변경해야 하는 메소드를 재정의하여 구현하고 필터의 doFilter() 메소드에 넘겨주면, 응답 결과를 변경할 수 있는 wrapper 클래스이다.

 

필터(filter) 설정

형식 - 1 : web.xml 에서 설정

- 필터 인터페이스를 구현한 클래스를 작성한 후 서블릿 컨테이너가 필터를 찾아서 호출할 수 있도록 웹 애플리케이션 배포 기술자 파일(web.xml)에 필터를 등록한다.

<web-app ...>
	:
    <filter>
    	<filter-name>필터이름</filter-name>
        <filter-class>패키지명을 포함한 필터클래스 명</filter-class>
        [<init-param>
        	<param-name>파라미터이름</param-name>
            <param-value>파라미터값</param-value>
        </init-param>]
    </filter>
    <filter-mapping>
    	<filter-name>필터이름</filter-name>
        <url-pattern>경로패턴</url-pattern>
    </filter-mapping>
    :
</web-app>

 

형식 - 2 : @WebFilter Annotation으로 설정

- Servlet 3.0부터 제공되는 Annotation으로 필터 처리를 위한 필터 객체를 등록 한다.

- web.xml의 관련 태그 : <filter>, <filter-mapping>

@WebFilter(
	attribute1=value1,
    attribute2=value2,
    ...
)

	public class TheFilter implements favax.servlet.Filter {
    	// implements Filter's methods
    }

 

 

package com.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

@WebFilter("/*")
public class TimerFilter implements Filter{
	private FilterConfig filterConfig;
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// 필터클래스의 객체가 생성될 때 한번 실행
		
		this.filterConfig = filterConfig;
	}
	
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// 클라이언트의 요청이 있을때마다 실행
		
		// request 필터
		long begin = System.currentTimeMillis();
		
		// 다음 필터 또는 필터의 마지막이면 end-pointer(jsp, 서블릿)를 실행
		chain.doFilter(request, response);
		
		// response 필터
		long after =System.currentTimeMillis();
		
		String uri = "";
		if(request instanceof HttpServletRequest) {
			HttpServletRequest req = (HttpServletRequest)request;
			
			uri = req.getRequestURI();
			filterConfig.getServletContext().log(uri + " : " + (after - begin) + "ms");
		}
	}

	@Override
	public void destroy() {
		// 필터 클래스의 객체가 파괴될 때 한 번 실행
		
	}
	
}

 

위를 사용해서

콘솔 창에 응답시간을 찍을 수 있다. 

+ Recent posts