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就够了)
总之,就两步,就可以实现缓存了:
- doGet方法里面响应一个头last-modified
- 写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();
}
}
}
嗯,运行起来试试效果如下,搞定
[]