Java Servlet里面设置页面缓存

HTTP根据响应头进行缓存。有很多种、区别网上面也说的很清楚,也很全面,不懂的可以去google一下,有etag,expires等等很多,基本都是通过响应头里面进行设置。

不过在实际应用里面,可以打开firebug等,不管你写多少个response.setHeader,想破脑袋也不能把页面缓存。总是一个个的200,服务器端的代码每刷一次就执行一次,半点用都没有。

即使是使用了response.setStatus(304),那又怎样,服务器代码还是照样运行了。呵呵,研究了一下last-modified这种头,讲解一下。

首先,要知道浏览器的缓存机制,如果发出一个GET请求,收到响应后发现响应头里面有个last-modified参数,会记录下来,下次再发送同样的GET请求时,会把这个值在请求头里面带进去,请求头为If-Modified-Since(只有GET请求,而且URL也要相同,cache?a和cache?b是不同的,浏览器不会带这个请求头)

有没有发现 Servlet 里面有个 getLastModified 方法,平时当然不怎么用了,如果用的话,会发现这个方法永远返回-1,这是关键,看方法是返回long型,如果想使用就返回上次更新的时间,servlet里面的service方法有用到(一般不用重写service方法,重写getLastModified就够了)

总之,就两步,就可以实现缓存了:

  1. doGet方法里面响应一个头last-modified
  2. 写getLastModified,以long型返回last-modified响应时间

先在web.xml里面配置一个 /cache 到servlet映射 ,再修改如下代码

package com.xdnote;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CacheServlet extends HttpServlet {

    protected long getLastModified(HttpServletRequest req) {
        try {
            Date date = DateFormat.getDateInstance().parse("2011-10-11");
            return date.getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return System.currentTimeMillis();
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    {
        System.out.println("之所以能够看到这段代码,是因为服务器没有响应304,运行一次后即可不再执行服务器程序");
        //设置的格式一定要为GMT STRING 不然会报错,用DataFormat去转换才能响应
        response.setHeader("Last-Modified", "Tue, 11 Oct 2011 00:00:00 GMT");
        System.out.println("成功给客户端设置了最后更新的时间为"+"Tue, 11 Oct 2011 00:00:00 GMT");
        try {
            PrintWriter pw = response.getWriter();
            pw.print("page");
            pw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

嗯,运行起来试试效果如下,搞定

[fidercache]