필터(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() {
// 필터 클래스의 객체가 파괴될 때 한 번 실행
}
}
위를 사용해서
콘솔 창에 응답시간을 찍을 수 있다.
'쌍용강북교육센터 > 11월' 카테고리의 다른 글
1117_Spring : 애노테이션을 이용한 객체간 의존 관계 설정 (0) | 2021.11.17 |
---|---|
1116_Spring : IoC(Inversion Of Control) 컨테이너 (0) | 2021.11.17 |
1116_Spring : Framework 프레임워크 (0) | 2021.11.17 |
1115_세미프로젝트 : Garment Market (0) | 2021.11.16 |
1110_JSP/Servlet : 커스텀 태그(Custom Tag) - 1 (0) | 2021.11.12 |