1111_JSP/Servlet : 필터(Filter)

1111_JSP/Servlet : 필터(Filter)

필터(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)에 필터를 등록한다.

: 필터이름 패키지명을 포함한 필터클래스 명 [ 파라미터이름 파라미터값 ] 필터이름 경로패턴 :

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

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

- web.xml의 관련 태그 : ,

@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() { // 필터 클래스의 객체가 파괴될 때 한 번 실행 } }

위를 사용해서

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

from http://development-writing.tistory.com/340 by ccl(S) rewrite - 2021-11-12 06:02:23