client와 서버 사이에 필터가 존재해서 들어오는 request와 response 를 필터가 먼저 받아 사전작업/사후 작업 등 공통적으로 수행되는 부분을 작업을 수행.
예를들어 한글 인코딩의 경우 필터에 넣어두면 항상 한글 인코딩을 해줄 수 있다.
myFilter.java 파일
import java.io.IOException; import java.util.Date; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class myFilter implements Filter { public void destroy() { System.out.println("디스트로이됨!"); } public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { System.out.println("사전작업!"); arg2.doFilter(arg0, arg1); System.out.println("사후작업!"); } public void init(FilterConfig arg0) throws ServletException { System.out.println("필터 init됨!"); } }
위와 같은 형태로 필터를 하나 만들어줄 수 있다.
그런데 이렇게 필터를 만들어준 것만으로는 필터의 역할이 작동하지 않는다.
web.xml 파일에 등록이 필요하다.
<web-app> ... <filter> <filter-name>myFilter</filter-name> <filter-class>myFilter</filter-class> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> ... </web-app>
web.xml 파일에 위와 같이 필터를 설정해주면, 필터가 작동하는 것을 확인할 수 있다.
web.xml 파일에 Initial Parameter를 지정해서 값을 가져올 수 있는데, 사실 이게 무슨 장점이 있을까 생각이 들 때도 있다.
그러나 이렇게 초기값을 web.xml에 넣어놓으면 web.xml 파일의 내용을 수정하는 것만으로도 모든 서버에 적용이 되고 이미 컴파일된 클래스에도 별도의 재컴파일 없이 바로 적용 가능하다는 장점이 있다.
<web-app> ... <filter> <filter-name>myFilter</filter-name> <filter-class>myFilter</filter-class> <init-param> <param-name>FILENAME</param-name> <param-value>c:\\myfilter.log</param-value> </init-param> <init-param> <param-name>DEFAULTENCODING</param-name> <param-value>UTF-8</param-value> </init-param> </filter> ... </web-app>
위와 같이 init-param 태그로 새로운 파라메터를 추가해주면, 이 값을 가져올 수 있게 된다.
import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class myFilter implements Filter { String defaultEncoding; PrintWriter printWriter; public void destroy() { printLog("[필터 종료 시간] " + new Date(System.currentTimeMillis()).toLocaleString()); try { printWriter.close(); } catch(Exception e) { e.printStackTrace(); } } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { printLog("[필터 사전작업 시간] " + new Date(System.currentTimeMillis()).toLocaleString()); request.setCharacterEncoding(defaultEncoding); filterChain.doFilter(request, response); printLog("[필터 사후작업 시간] " + new Date(System.currentTimeMillis()).toLocaleString()); } public void init(FilterConfig arg0) throws ServletException { defaultEncoding = arg0.getInitParameter("DEFAULTENCODING"); try { printWriter = new PrintWriter(new FileWriter(arg0.getInitParameter("FILENAME"), true), true); printLog("[필터 초기화 시간] " + new Date(System.currentTimeMillis()).toLocaleString()); } catch (IOException e) { e.printStackTrace(); } } public void printLog(String log) { printWriter.println(log); System.out.println(log); } }