一】設置緩存文件的有效日期
重點方法:
HttpServletRequest類:
1》String getRequestURI();//獲取客戶端地址欄的路徑值
HttpServletResponse類:
2》void SetDateHeader(String name, long endTime);
name:對應的瀏覽器類型。 IE瀏覽器爲:expires
endTime:緩存文件失效的時間,單位爲毫秒
code:
String uri = request.getRequestURI();
//若是是一個html靜態資源
if(uri!=null && uri.endsWith("html")){
String html = this.getServletConfig().getInitParameter("html");
if(html!=null){
long end = Long.parseLong(html)*1000 + System.currentTimeMillis();
response.setDateHeader("expires",end);
}
}
二】能夠經過複寫getLastModified方法來阻止每次刷新都訪問服務端,來減輕服務端的壓力
原理:
1》Servlet對象來應答客戶端的請求的時候,首先會調用service()方法
2》查看service()方法的源碼,能夠知道:
service()方法會調用getLastModified()方法,
若是此方法的返回值 > 客戶端的時間: 調用doGet()或doPost()方法,併發送狀態碼200給客戶端
若是此方法的返回值 == 客戶端的時間: 發送狀態碼304給服務端
若是此方法的返回值 爲-1: 調用doGet()或doPost()方法,併發送狀態碼200給客戶端。
方法原型:
protected long getLastModified(HttpServletRequest req);
返回值:
返回時間HttpServletRequest對象的最後修訂時間,
若是時間是未知的,則此方法返回一個負數(默認值)
1》返回值爲 -1:表明文件最後一次修改的時間不肯定
處理方式:因爲不知道最後一次修改時間,因此必定會調用doGet()或doPost()方法 ,來從新獲取資源
2》返回值 不等於 -1:表明文件最後一次修改的時間
處理方式:拿文件最後一次修改的時間和緩存中的時間來進行對比,(此過程經過tomcat服務器來實現)
若是文件已經更新,須要調用doGet()或doPost()方法,從新獲取資源(併發送:202)
若是文件版本同樣,會發送304狀態碼,讓客戶端本身在緩存文件中找。
思路:
因此咱們能夠經過資源對象的lastModified()方法,獲取服務器最後一次修改資源的時間。
補充:
servlet源碼:
Servlet{SUN源碼
service()
{
if(req.getHead(「if-lastxxx」)==null)
{
res.setHead(「lastxx」,」時間值」);
doXXX();
}
if(getLastModified()>IE時間值)
{
res.setHead(「lastxx」,」時間值」);
doXXX();
}else{
res.setStatus(304);
}
}
getLastModified(){
return 時間值
}
}
code:
/*設置爲*/
/*此代碼有問題*/
public class Demo7 extends HttpServlet {
@Override
protected long getLastModified(HttpServletRequest req) {
System.out.println("modifi");
/*將資源的路徑從工程的路徑轉換到真實的路徑*/
String path = this.getServletContext().getRealPath("/doc/resource.txt");
File file = new File(path);
return file.lastModified();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext context = this.getServletContext();
InputStream is = context.getResourceAsStream("/doc/resource.txt");
ServletOutputStream sos = response.getOutputStream();
byte[] buf = new byte[1024];
int len = -1;
while((len=is.read(buf)) > 0){
sos.write(buf, 0, len);
}
System.out.println("serv");
is.close();
sos.close();
}
}
注意:
1》關於緩存的刷新
對於瀏覽器的刷新而言,當瀏覽器緩存中有此資源,也會找服務端從新要資源;
而在回車訪問的狀況下,才直接找緩存,不會找服務端要。
2》
其實瀏覽器訪問的html靜態資源本質上是由一個缺省的Servlet來幫你處理,轉發給客戶端的。
補充:servlet對象常見方法
1》得到一個ServletConfig對象
ServletConfig getServletConfig();
2》獲取一個ServletContext對象
ServletContext getServletContext();
html