import java.io.File;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class CacheFilter
implements Filter
{
private static final Log logger = LogFactory.getLog(CacheFilter.class);
public static final String HEADER_LAST_MODIFIED = "Last-Modified";
public static final String HEADER_CONTENT_TYPE = "Content-Type";
public static final String HEADER_CONTENT_ENCODING = "Content-Encoding";
public static final String HEADER_EXPIRES = "Expires";
public static final String HEADER_IF_MODIFIED_SINCE = "If-Modified-Since";
public static final String HEADER_CACHE_CONTROL = "Cache-Control";
public static final String HEADER_ACCEPT_ENCODING = "Accept-Encoding";
private int adddays = 1;
public void destroy()
{
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException
{
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
String uri = request.getRequestURI();
int subStart = uri.indexOf("/", 1);
String uri2 = uri.substring(subStart);
String realpath = request.getSession().getServletContext()
.getRealPath(uri2);
if (logger.isDebugEnabled()) {
logger.debug("request uri: " + uri + " --> uri_sub: " + uri2 +
" --> real path: " + realpath);
}
boolean isContinue = true;
File file = new File(realpath);
if (file.exists())
{
if (file.isFile()) {
if (logger.isDebugEnabled()) {
logger.debug("[EXISTS FILE] request uri: " + uri +
"\n --> real path: " + realpath + " ");
}
long modelLastModifiedDate = file.lastModified();
isContinue = !checkHeaderCache(this.adddays, modelLastModifiedDate,
request, response);
}
else if (logger.isDebugEnabled()) {
logger.debug("[EXISTS NOT FILE] request uri: " + uri +
"\n --> real path: " + realpath + " ");
}
}
else if (logger.isDebugEnabled()) {
logger.debug("[NOT EXISTS] request uri: " + uri +
" --> real path: " + realpath);
}
if (logger.isInfoEnabled()) {
logger.info("request uri: " + uri + " , Is do filter: " + isContinue);
}
if (isContinue)
chain.doFilter(req, resp);
}
public void init(FilterConfig conf)
throws ServletException
{
}
public static boolean checkHeaderCache(int adddays, long modelLastModifiedDate, HttpServletRequest request, HttpServletResponse response)
{
request.setAttribute("myExpire", Integer.valueOf(adddays));
long header = request.getDateHeader("If-Modified-Since");
if (modelLastModifiedDate > header)
{
setRespHeaderFirst(adddays, modelLastModifiedDate, request,
response);
return false;
}
setRespHeaderCache(adddays, modelLastModifiedDate, request,
response);
return true;
}
public static void setRespHeaderCache(int adddays, long modelLastModifiedDate, HttpServletRequest request, HttpServletResponse response)
{
long adddaysM = adddays * 1000L;
String maxAgeDirective = "max-age=" + adddays;
response.setHeader("Cache-Control", maxAgeDirective);
response.setStatus(304);
response.addDateHeader("Last-Modified", modelLastModifiedDate);
response.addDateHeader("Expires", System.currentTimeMillis() + adddaysM);
}
public static void setRespHeaderFirst(int adddays, long modelLastModifiedDate, HttpServletRequest request, HttpServletResponse response)
{
long adddaysM = adddays * 1000L;
String maxAgeDirective = "max-age=" + adddays;
response.setHeader("Cache-Control", maxAgeDirective);
response.setStatus(200);
response.addDateHeader("Last-Modified", modelLastModifiedDate);
response.addDateHeader("Expires", modelLastModifiedDate + adddaysM);
}
}