Writing /volume1/Web/Public/dokuwiki/data/log/deprecated/2024-11-13.log failed

Java Servlet Filter

servlet에 의해 동적으로 생성된 이미지를 클라이언트쪽에 캐싱시키는 방법을 소개한다. Struts Framework를 사용하고 있다면, RequestProcessor class를 확장해서 요청처리전에 Cache-Control의 Response header를 설정함으로써 캐쉬 설정을 할 수 있다. 1)
하지만, 동적으로 이미지를 생성하는 독자적인 servlet 2) 의 경우 RequestProcessor를 이용해 캐쉬 설정하는 것은 불가능하다. 이럴 경우의 대안으로 Servlet Filter를 사용할 수 있다.
Servlet의 요청 처리 이전에 response header의 캐쉬 설정을 함으로써 가능해진다.

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 설정을 할 수 있다.

<filter>
  <filter-name>
   ResponseHeaderFilter</filter-name>
  <filter-class>
   com.jspbook.ResponseHeaderFilter</filter-class>
  <init-param>
    <param-name>
     Cache-Control</param-name>
    <param-value>
     max-age=3600</param-value>
  </init-param>
</filter>
 
<filter-mapping>
  <filter-name>
   ResponseHeaderFilter</filter-name>
  <url-pattern>/logo.png</url-pattern>
</filter-mapping>

max-age=3600의 의미는 3600 seconds(60minute)동안 cache시키겠다는 의미이다. 반대로 client의 cache를 막기위해서는 위의 <filter>부분을 다음코드로 치환시키면 된다.

<filter>
  <filter-name>
   ResponseHeaderFilter</filter-name>
  <filter-class>
   com.jspbook.ResponseHeaderFilter</filter-class>
  <init-param>
    <param-name>Cache-Control</param-name>
    <param-value>
      private,no-cache,no-store</param-value>
   </init-param>
</filter>

reference

1)
스트럿츠 관련 caching control참조
2)
Struts의 ActionServlet과는 별도의 servlet을 말한다.

QR Code
QR Code study:java:filter (generated for current page)