====== Java Servlet Filter ====== servlet에 의해 동적으로 생성된 이미지를 클라이언트쪽에 캐싱시키는 방법을 소개한다. Struts Framework를 사용하고 있다면, %%RequestProcessor%% class를 확장해서 요청처리전에 Cache-Control의 Response header를 설정함으로써 캐쉬 설정을 할 수 있다. ((스트럿츠 관련 [[study:java:struts|caching control]]참조))\\ 하지만, 동적으로 이미지를 생성하는 독자적인 servlet ((Struts의 %%ActionServlet%%과는 별도의 servlet을 말한다.)) 의 경우 %%RequestProcessor%%를 이용해 캐쉬 설정하는 것은 불가능하다. 이럴 경우의 대안으로 Servlet Filter를 사용할 수 있다.\\ Servlet의 요청 처리 이전에 response header의 캐쉬 설정을 함으로써 가능해진다. {{keywords>cache control Servlet Filter ResponseHeaderFilter Cache-Control}} ===== ResponseHeaderFilter ===== response header 설정을 가능하게 하는 filter의 예를 소개한다. 컴파일된 소스는 http://www.jspbook.com/jspbook.jar로부터 구할 수 있다. package com.jspbook; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; public class ResponseHeaderFilter implements Filter { FilterConfig fc; public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) res; // set the provided HTTP response parameters for (Enumeration e=fc.getInitParameterNames(); e.hasMoreElements();) { String headerName = (String)e.nextElement(); response.addHeader(headerName, fc.getInitParameter(headerName)); } // pass the request/response on chain.doFilter(req, response); } public void init(FilterConfig filterConfig) { this.fc = filterConfig; } public void destroy() { this.fc = null; } } 위의 filter가 하는 일은 web.xml의 context parameter로부터 response header를 설정하는 것이다. 이 작업을 하는 것이 다음의 4줄이다. for (Enumeration e=fc.getInitParameterNames(); e.hasMoreElements();) { String headerName = (String)e.nextElement(); response.addHeader(headerName, fc.getInitParameter(headerName)); } ===== Cache Control using ResponseHeaderFilter ===== 앞서의 %%ResponseHeaderFilter%%를 이용해 cache 설정을 해보자. Response Header중에 Cache 관련 헤더는 Cache-Control이다. 다음의 code를 web.xml에 추가함으로써 cache 설정을 할 수 있다. ResponseHeaderFilter com.jspbook.ResponseHeaderFilter Cache-Control max-age=3600 ResponseHeaderFilter /logo.png max-age=3600의 의미는 3600 seconds(60minute)동안 cache시키겠다는 의미이다. 반대로 client의 cache를 막기위해서는 위의 부분을 다음코드로 치환시키면 된다. ResponseHeaderFilter com.jspbook.ResponseHeaderFilter Cache-Control private,no-cache,no-store ====== reference ====== 1.[[http://www.onjava.com/pub/a/onjava/2004/03/03/filters.html?page=1|Another Java Servlet Filter Most Web Applications Should Have ]]