back-end/서블릿
서블릿 필터
Ryuuu
2021. 6. 28. 16:18
Filter의 개념과 사용하는 이유
필터는 서블릿 실행 전, 후에 어떤 작업을 하고자 할때 사용한다. 예를 들어 클라이언트가 보낸 데이터의 암호를 해제한다거나, 서블릿이 실행되기 전에 필요한 자원을 미리 준비하거나, 서블릿이 실행될 때마다 로그를 남긴다거나 하는 작업을 필터를 통해 처리할 수 있다.
필터의 실행
만약 그런 작업들을 서블릿에 담는다면 필요한 서블릿마다 해당 코드를 삽입해야하고 필요가 없어지면 그 코드를 삽입한 서블릿을 모두 찾아서 삭제해야 하므로 관리하기가 매우 번거로워진다.
EX)
package com.ryuuu.web.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; @WebFilter("/*") public class CharacterEncodingFilter implements Filter { @Override public void doFilter(ServletRequest request , ServletResponse response , FilterChain chain) throws IOException, ServletException { response.setCharacterEncoding("UTF-8"); request.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charsest=UTF-8"); chain.doFilter(request, response); } }
doFilter로 인하여 필터가 적용이 된다. 필터의 메인함수로 이해하면 될듯. 요청이 들어올때마다 수행된다.
filterChain은 다음 필터를 가리키고 filterChain.doFilter()는 다음 필터를 호출한다. 다음 필터가 없다면 내부적으로 서블릿의 service()를 호출한다.
web.xml 사용 서블릿 필터
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.ryuuu.web.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
이런식으로 평소에 web.xml 사용하듯이 해주면 된다.
어노테이션 사용 서블릿 필터
@WebFilter("/*")
처음 예시처럼 필터 파일에 어노테이션을 사용하여 한줄 추가하면 된다.
일일이 코드를 써야되는 web.xml과 달리 간단하게 필터를 적용 가능하다.