Java 解决浏览器缓存

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);
  }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值