优化浏览器缓存

优化浏览器缓存
    大多数的Web资源都很少发生修改,如:CSS,Javascript,Images。这些资源浏览器需要花费时间下载,浏览器或者代理缓存这些资源可以减少访问页面的次数。缓存可以减少大量的请求资源的HTTP连接,从而减少浏览器与服务器的往返时间,较少服务器响应的总体负荷。
一. 浏览器缓存
1. HTTP1.1提供以下几种缓存header
      a. Expires和Cache-Control:max-age  这是无条件的强制缓存设置,只有超时浏览器才会从服务器重新下载缓存的资源。Expires 和Cache-Control 不能重复设置。
      b. Last-Modified和ETag  浏览器检查资源是否相同而决定是否重新下载。Last-Modified 通常设置一个日期;ETag 可以指定任意值唯一标识资源(如:版本、内容散列)。Last-Modified和ETag不能重复设置。

2. 能够缓存资源建议缓存设置
     a. Expires 最少设置一个月,甚至可以设置一年。设置超过一年就违反RFC指引(RFC guidelines)了。建议使用Expires而不采用Cache-Contol:max-age,因为Expires被更多的浏览器支持。
如果能够清晰的知道资源将被修改时间,可以设置一个明确的日期;如果觉得可能很快就会被修改,但不知道是什么时候,可以采用URL指纹设置长有效期。大多少浏览器采用最少使用原则清除缓存,因此采用积极的缓存策略比较合适。
    b. 采用指纹动态启用缓存
该缓存策略适合偶尔发生修改的资源,只有资源在服务器中发生了变化,浏览器才重新下载资源。
通过在资源URL中添加指纹实现。当资源发生变化后URL中的指纹跟着变化,因为URL已经发生变化所以浏览器强制下载新的资源。
    c. IE浏览器中的Vary header。IE浏览器不会缓存任何使用Vary Header传递的数据,因此建议总是去除Vary header。
3. 采用Java Servlet Filter设置缓存的例子
 a.下载附件中的PageExpiryFilter.java 文件
 b. 在Web.xml文件中添加

<filter> 
<filter-name>PageExpiryFilter</filter-name> 
<filter-class>com.vineetmanohar.web.PageExpiryFilter</filter-class> 
</filter> 
<filter-mapping> 
<filter-name>PageExpiryFilter</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping>
<filter>


 c. 创建resources/expires.properties 文件,内容如下: 

^/css/.*  = 30d 
^/js/.*   = 15d 
^.*\.png$ = 2M 

  参数说明
 第一行表示css文件缓存30天
 第二行标识js文件缓存15天
 第三行标识png文件缓存2个月
     d. url 设置模式:
           <full regex of the resource> = <number><unit>
           Unit可选值: m 分钟;h 小时;d 天;w 星期;M 月;


二. 代理服务器缓存
      除了浏览器缓存之外,HTTP允许Web代理服务器缓存静态资源。在HTTP Header中为静态资源启用公共缓存(Cache-control: public ),让浏览器从最近的代理服务器下载资源而不从较远的服务器下载。
1. 在静态资源URL中不采用查询参数(如:?) 因为大多少代理服务器软件(如:Squid)不会缓存这类资源。


2. 允许代理缓存的资源不要设置Cookies。公共缓存是在多个用户之间缓存静态资源,这就意味这些资源的Cookies将被共享,且大多少浏览器不会缓存带Cookies的资源。


3. 注意代理服务器缓存JS和CSS文件将出现的问题。部分Web 代理服务不会检查Content-Encoding header,这将有可能导致将压缩的文件传输给浏览器造成不能正确的解析。
      a. 设置Cache-Control:private 禁止代理缓存这些资源,如果您的应用程序是多宿主的业务遍布全球,依靠用户所在地的代理缓存较少,这可能是一个适当的设置。
      b. 设置 Vary:Accept-Encoding 该指令让代理服务器缓存两套资源一套压缩的,一套未压缩的。正确版本的资源传递依赖浏览器请求时的Header。如果应用是单宿主,依赖在用户本地的代理时这是一个不错的选择。 

 

猜你喜欢

转载自jizheng1125-gmail-com.iteye.com/blog/1161699