`
苦逼的程序员
  • 浏览: 28511 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

HTTP 缓存

阅读更多

      项目中有一个公共页面mian.jsp,里面有大量的javascript代码,需要将他分离出来,尽可能的利用浏览器的缓存。一些常规的java脚本只需要放到js文件中就行,还有一些javascript代码是动态的(也就是说会有一些jstl标签代码)就不能放到js文件中了。我采取的方案是将这些含有jstl标签的javascript脚本代码放入到一个gsp文件中,然后在页面中引用。例如:

<script type="text/javascript" src="${staticurl}/js/userAutoTips.jsp"></script>

   显然这种方式仅仅是实现了javascript脚本的分离,这种页面默认是不缓存的,所以每次需要的时候仍然会请求信息。要想让服务器缓存这些页面,需要做点手脚。

      首先我们来看一下Http的缓存。

HTTP缓存 / Http Cache

1、ETag
Http1.1中没有规定ETag的格式和生成方式,只要求用双引号括起来。因此可以用MD5,或者直接用文件的最后修改时间。Tomcat就采用 文件大小 + "-" + 文件最后修改时间的毫秒数 来生成ETag。
Etag 与 If-None-Match 对应。
第一次请求时,服务端响应头中有ETag(红色下划线 所示)。



 

第二次请求时,请求头中就带有If-None-Match(红色下划线 所示)。服务器判断请求头中 If-None-Match 与服务端计算的ETag是否一致,如果一致就表示没有更新,返回304,否则按第一次请求时处理。


2、Last-Modified
Last-Modified与If-Modified-Since对应。
第一次请求时,响应头中带有 Last-Modified(蓝色下划线 所示),格式如:Wed, 22 Jul 2009 07:08:07 GMT,是零时区的 GMT 时间。


 
 

第二次请求时,请求头中就带有If-Modified-Since(蓝色下划线 所示)。服务器判断请求头中If-Modified-Since与请求资源的最后修改时间是否一致,如果一致就表示资源没有更新,返回304,否则按第一次请求时处理。


 
 


3、Cache-Control
Cache-Control是一个集合属性,可以包含多个子属性。

  • max-age - 以秒为单位的超时,覆盖Expires属性。
  • public - 允许保存在共享缓存中。
  • private - 只允许保存在私有缓存中。
  • no-cache - 不允许缓存。
  • no-store - 不允许缓存在持久介质中。
  • no-transform - 不允许转换存储系统。

第一次请求时,响应头中带有Cache-Control(红色下划线 所示)。


 
 



第二次请求时,浏览器判断Cache-Control,如果是max-age并且其值有效(在有效的缓存时间内),浏览器直接使用本地缓存,不向服务端发送请求,否则按第一次请求处理;如果是no-cache和no-store,不缓存,每次都是重新向服务端请求。


 
 
说明:
在firebug中,使用本地缓存时,资源名称会变成灰色


4、Expires
第一次请求时,响应头中带有 Expires(蓝色下划线 所示),格式如:Wed, 22 Jul 2009 07:08:07 GMT,是零时区的 GMT 时间。


 
 


第二次请求时,浏览器判断Expires,如果Expires是有效的,浏览器直接使用本地缓存,不向服务端发送请求,否则按第一次请求处理。


 
 

 

 

说明: 在firebug中,使用本地缓存时,资源名称会变成灰色

 

public static boolean checkHeaderCache(long adddays, long modelLastModifiedDate, 
HttpServletRequest request, HttpServletResponse response) {
		// com.jdon.jivejdon.presentation.filter.ExpiresFilter
		request.setAttribute("myExpire", adddays);

		// convert seconds to ms.
		long adddaysM = adddays * 1000;
		long header = request.getDateHeader("If-Modified-Since");
		long now = System.currentTimeMillis();
		if (header > 0 && adddaysM > 0) {
			if (modelLastModifiedDate > header) {
				// adddays = 0; // reset
				response.setStatus(HttpServletResponse.SC_OK);
				return true;
			}
			if (header + adddaysM > now) {
				// during the period happend modified
				response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
				return false;
			}
		}

		// if over expire data, see the Etags;
		// ETags if ETags no any modified
		String previousToken = request.getHeader("If-None-Match");
		if (previousToken != null && previousToken.equals(
         Long.toString(modelLastModifiedDate))) {
			// not modified
			response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
			return false;
		}
		// if th model has modified , setup the new modified date
		response.setHeader("ETag", Long.toString(modelLastModifiedDate));
		setRespHeaderCache(adddays, request, response);
		return true;

	}

	public static boolean setRespHeaderCache(long adddays, HttpServletRequest request, 
                   HttpServletResponse response) {
		request.setAttribute("myExpire", adddays);
                long adddaysM = adddays * 1000;
		String maxAgeDirective = "max-age=" + adddays;
		response.setHeader("Cache-Control", maxAgeDirective);
		response.setStatus(HttpServletResponse.SC_OK);
		response.addDateHeader("Last-Modified", System.currentTimeMillis());
		response.addDateHeader("Expires", System.currentTimeMillis() + adddaysM);
		return true;
	}

  通过客户端http缓存 服务器端缓存 这些技术综合在一起,可以大大增强每台服务器抗高负载能力,把带宽留给更需要实时更新的模型或页面。


这 种方式比静态化页面的好处是:精确性,静态页面.html比如Apache中mod_expire设置,如设置expire为十分钟,如果过了十分钟,其 实页面内容还是没有变,也要加载静态页面到客户端,而结合Etag的动态页面,不但起到静态页面一样的效果(其实经过Apache处理的静态页面html 也是动态页面),而且可以做到精确制导,就象多国部队轰炸利比亚一样,精确打击。这是灵活性的魅力。

 


5、附录
1、Cache-Control和Expires对F5和Ctrl+F5无效。当按F5刷新或按Ctrl+F5强制刷新时,IE和Firefox都会忽视本地缓存,重新向服务端发起请求

Firefox IE
刷新 F5
Cache-Control: max-age=0
强制刷新 Ctrl+F5
Pragma: no-cache
Cache-Control: no-cache
刷新 F5
If-Modified-Since: Sun, 21 Nov 2004 14:35:21 GMT
If-None-Match: "14f598-916-a64a7c40"
强制刷新 Ctrl+F5
Cache-Control: no-cache

  • 大小: 9.8 KB
  • 大小: 9.4 KB
  • 大小: 9.8 KB
  • 大小: 9.4 KB
  • 大小: 10 KB
  • 大小: 9.3 KB
  • 大小: 10 KB
  • 大小: 9.3 KB
分享到:
评论

相关推荐

    Android http缓存实现

    在Android开发中,HTTP缓存是一种重要的技术,它允许应用程序在本地存储网络请求的数据,以便在没有网络连接或网络连接不稳定时仍能访问这些数据,从而实现离线应用的功能。HTTP缓存主要遵循HTTP协议中的缓存控制...

    Go-pike是HTTP缓存服务提供高效简单的HTTP缓存服务

    Go-pike是一个基于Go语言开发的HTTP缓存服务,它为用户提供了一种高效且简洁的解决方案,以替代传统的HTTP缓存工具如Varnish。Varnish以其出色的性能和强大的VCL(Varnish Configuration Language)配置而闻名,但在...

    http缓存.pptx

    http缓存详解ppt原创 1. 缓存的类型 2. http缓存详解 •http请求流程 •缓存操作的目标 •缓存控制 •缓存验证 •新鲜度 •vary响应 3. http缓存的应用及意义 4. 关于http缓存的一些问题

    http缓存应用代码示例

    http缓存处理的示例代码,应该对你们有用吧,如果对网站性能很关注的话

    浏览器HTTP缓存机制

    ### 浏览器HTTP缓存机制详解 #### 一、概述 HTTP缓存机制是现代Web应用中的一个重要组成部分,它能够显著提升用户体验并减轻服务器负载。本文将详细探讨浏览器HTTP缓存的工作原理及其背后的机制。 #### 二、HTTP...

    浏览器HTTP缓存运行机制流程图.zip

    浏览器HTTP缓存是提高网页加载速度和降低服务器压力的关键机制,它主要分为两种类型:强缓存(Strong Cache)和协商缓存(Conditional Cache)。理解这两种缓存的工作原理对于优化Web应用性能至关重要。 1. 强缓存...

    2024年浏览器缓存HTTP缓存机制(面试常考).zip

    浏览器缓存【2024年浏览器缓存/HTTP缓存机制(面试常考)简介】 内容概要: 这篇博客为网络技术初学者提供了一个全面的理解浏览器缓存和HTTP缓存机制的指南。通过通俗易懂的语言,本博客介绍了浏览器缓存的工作原理...

    Android-金山云android平台http缓存SDK可方便地与播放器集成实现http点播视频边播放边下载缓存功能

    金山云Android平台HTTP缓存SDK就是为了满足这一需求而设计的。它允许开发者轻松地将缓存功能集成到自己的播放器应用中,使得用户在观看http点播视频时可以实现无缝播放和后台下载。 1. **SDK集成** 首先,开发者...

    http缓存知识梳理

    HTTP缓存是网络传输中非常重要的一个概念,它可以有效减少网络延迟,提高页面加载速度,从而改善用户体验。HTTP缓存机制主要通过浏览器或中间缓存服务器对已下载的资源进行存储,当下次客户端发起相同资源的请求时,...

    HTTP缓存算法研究与实现.docx

    HTTP缓存是网络数据传输优化的关键技术之一,其主要目的是减少网络拥塞,提升服务器效率,加快用户访问速度。本文将深入探讨HTTP缓存的工作原理,主要包括缓存分类、副本新鲜保持机制以及LRU缓存算法。 首先,HTTP...

    HTTP缓存算法研究与实现.pdf

    HTTP缓存是网络数据传输优化的关键技术之一,其主要目的是减少网络拥塞,加快信息访问速度,减轻服务器负载。在HTTP协议中,缓存机制主要包括文档过期(Document Expiration)和服务器再验证(Server Revalidation)...

    HTTP缓存PDF.pdf

    HTTP缓存

    安卓应用HTTP缓存缺陷的动态检测.pdf

    在移动应用开发领域,尤其是Android客户端开发中,HTTP缓存是一种常见的优化手段,它能够显著降低数据流量消耗,提升响应速度。然而,不恰当或错误的缓存使用可能导致存储空间的浪费,甚至影响应用的性能。这篇名为...

    Go-microcache实现作为Go中间件的非标准HTTP缓存

    本文将深入探讨"Go-microcache",这是一个专为Go设计的轻量级中间件,用于实现非标准HTTP缓存。 首先,让我们了解HTTP缓存的基本原理。HTTP缓存是一种优化网络性能的技术,通过存储服务器响应并在后续请求中重用...

    浏览器之HTTP缓存的那些事

    ### 浏览器之HTTP缓存的那些事 #### 一、引言 在现代互联网应用中,HTTP缓存机制是提升用户体验、节省网络资源的关键技术之一。通过合理利用浏览器缓存,不仅可以加快网页加载速度,减少服务器负载,还能有效降低...

    符合 RFC 且支持 ESI 的 Nginx , OpenResty HTTP 缓存,由 Redis 支持.zip

    壁架符合 RFC 规范并支持ESI 的Nginx / OpenResty HTTP 缓存,由Redis提供支持。Ledge 可以作为 Squid / Varnish 等的快速、强大且可扩展的替代品,可以独立安装,也可以集成到现有的 Nginx 服务器或负载均衡器中。...

    faraday-http-cache, 一个支持HTTP缓存的法拉第.zip

    faraday-http-cache, 一个支持HTTP缓存的法拉第 Faraday 通过检查已经存储响应的过期和验证来尊重HTTP高速缓存的法拉第基于消息的中间件。安装将它添加到你的Gemfile:gem 'faraday-http-cache'的使用和配置你必须在...

Global site tag (gtag.js) - Google Analytics