용테크
[JSP,Servlet] Servlet Filter 본문
필터는 서블릿 실행 전, 후에 어떤 작업을 하고자 할때 사용한다.
예를 들어 클라이언트가 보낸 데이터의 암호를 해제한다거나, 서블릿이 실행되기 전에 필요한 자원을 미리 준비하거나, 서블릿이 실행될 때마다 로그를 남긴다거나 하는 작업을 필터를 통해 처리할 수 있다.

Servlet Filter 구현
Servlet Filter 인터페이스는 3개의 메소드로 구현된다.
1. init
init() 메소드는 필터 객체가 생성되고 준비 작업을 위해 딱 한번 호출된다. 서블릿의 init()과 같은 용도이다. 이 메소드의 매개변수는 FilterConfig의 인스턴스이다. 이 인스턴스를 통해 필터 초기화 매개변수의 값을 꺼낼수 있다. 아래 코드에서는 doFilter()에서 사용하기 위해 인스턴스 변수 config에 저장한다.
public void init(FilterConfig filterConfig) throws ServletException {
this.pattern = filterConfig.getInitParameter("pattern");
}
2. doFilter(ServletRequest request, ServletResponse response)
필터와 매핑된 URL에 요청이 들어올때마다 doFilter()가 호출된다. 이 메소드에 필터가 할 작업을 작성한다.
filterChain은 다음 필터를 가리키고 filterChain.doFilter()는 다음 필터를 호출한다. 다음 필터가 없다면 내부적으로 서블릿의 service()를 호출한다.
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String uri = httpRequest.getRequestURI();
String query = httpRequest.getQueryString();
String fullUri = uri + query;
// 페턴 검사
if (!StringUtils.isNullOrEmpty(pattern)) {
Pattern pt = Pattern.compile("\\/\\.\\.|\\\\\\.\\.");
if ((uri != null && pt.matcher(URLDecoder.decode(uri, FrameEnvironment.getCharSet())).find())
|| (query != null && pt.matcher(URLDecoder.decode(query, FrameEnvironment.getCharSet())).find())) {
HttpServletResponse res = (HttpServletResponse) response;
String emsg = ValueFormatter.get("Server.filter.fail : Url->{0}, Query->{1}, Pattern->{2}", uri, query, pattern);
res.sendError(500, emsg);
Log.error(this, emsg);
return;
}
}
chain.doFilter(request, response);
}
3.destory( )
필터 객체가 삭제 될 때 호출되는 메소드. 따라서 destory( ) 메소드에는 주로 자원 해제 기능을 구현한다.
@Override
public void destroy() {
// TO-PASS
}
Filter 등록
web.xml 에 구현된 Filter를 등록해주거나, 어노테이션에 배치정보를 등록해준다.
web.xml
서블릿의 배치 정보를 설정하는 것과 유사하다.
<filter>
<filter-name>HTTPFilter</filter-name>
<filter-class>com.support.HTTPFilter</filter-class>
<init-param>
<param-name>pattern</param-name>
<param-value>\/\.\.|\\\.\.</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>HTTPFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-name> : 필터 별칭 설정
<filter-class> : 패키지 이름을 포함한 필터 클래스 작성
<init-param> : 필터가 사용할 정적 데이터 설정
<filter-mapping> : 필터를 사용할 URL 매핑
<filter-name> : 필터 별칭 지정
<url-pattern> : 필터가 적용되어야 하는 URL 지정. /*와 같이 지정하면 모든 요청에 대해 필터 적용
어노테이션
애노테이션만으로는 필터의 실행순서를 정할 수 없다. 만약 순서를 정하고 싶다면 아래에서 링크처의 설명처럼 web.xml에 정의하고자 하는 실행순서에 따라 필터 맵핑을 순서대로 작성해주면 된다.
"WAR에서 어노테이션을 사용하여 서블릿 필터 실행 순서를 정의하는 방법"
https://code.i-harness.com/ko/q/641cc9
java-ee - 호출 - 자바 서블릿 매핑
WAR의 자체 web.xml 에서 webapp 특정 서블릿 필터를 정의하면 필터 실행 순서는 web.xml 정의 된 순서와 동일합니다. 그러나 @WebFilter annotation을 사용하여 필터를 정의하면 필터 실행 순서는 무엇이며 ��
code.i-harness.com
@WebFilter{
filterName="HTTPFilter"
}'JAVA > JSP,Servlet' 카테고리의 다른 글
| [JSP,Servlet] Burp Suite 사용하기 (0) | 2020.10.27 |
|---|---|
| [JSP,Servlet] XSS(크로스사이트 스크립팅)처리 (2) | 2020.07.30 |