`
yfyh87
  • 浏览: 35171 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

WEB动态页面的客户端缓存

阅读更多
    我们知道,对于WEB页面中的JS和CCS,并不会每次都请求完整的内容,有时候会直接利用本地的缓存;而对页面本身,却往往会去加载完整内容,对于服务器来说可能每次也要生成完整的内容,并送到客户端;同样的,对于一些http接口,每次调用也会去重新生成数据,浏览器也会重新加载完整的数据;

    但有这样一些页面,虽然是动态的但变动频率较小,且对于同一用户重复调用可能很多(比如说个人管理后台或者新闻首页面),我们希望像js或者ccs那样在客户端缓存起来.并且,在我们希望的时候,可以更新客户端备份的那个页面,或者接口数据.是否可以做到呢;

    事实上,浏览器可以缓存js,就一定能缓存我们的动态页面;

    先研究下js是如何缓存起来的:

    用firebug看一下js的加载:
    先强刷(ctrl+F5)一下 http://ilab.iteye.com/ 页面,观看js的加载如图



    状态为200 , 查一下200的含意 :

请求成功(其后是对GET和POST请求的应答文档。)

这是对js文件的完整加载;

    再直接F5刷新下 http://ilab.iteye.com/ ,观看js的加载如图


    状态为304,再查一下304的含意:

未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。

    此时其实并没有从服务端加载完整文件而是去读的本地缓存;
从304的描述来看,我们知道,请求依然发出,并由服务端告知浏览器,掉用缓存;
我们可以总结出两点:
1.
由于服务端只是返回简单的头信息,并没有生成完整页面,所以虽然请求依然发出,对于浏览器和服务器来说都更快更轻松了;

2.
我们可以控制浏览器去更新缓存;)


    具此,我们可以得出结论,对于某此动态页面来说,完全可以充分利用浏览器缓存来降低服务器压力,提升客户端速度;

----------------------------------分隔线 ----------------------------------------

    现在我们来看下要怎么做;
    由于对文档的描述在http头信息中,并且依据304的描述,我们知道,这个属性和 Modified Time有关,我们比对下普通的页面和js的页面的respose的头信息的不同:

我们发现,多了个Last-Modified的属性;
    再比对请求,

发现,多了If-Modified-Since;
    武断的推测一下(或者认真的读下http协议的文档):我们可以这样认为:

1.第一次请求成功返回202;
2.假如返回头信息有Last-Modified属性 则存入浏览器缓存;
3.再次请求,假如请求的为缓存页面,则头信息中加入 If-Modified-Since;
4.服务端通过If-Modified-Since(即上次响应中Last-Modified的值)来判断是否需要更新,否的话返回304;
5.假如返回304,则浏览器则读缓存;




按照这个原理我们通过 HttpServletResponse, HttpServletRequest来偿试实现下:

对任意一个页面先来句
getResponse().addHeader("Last-Modified", "hello kitty");

然后再次请求该页面时,我们就可以发现请求中就有了 If-Modified-Since 属性
getRequest().getHeader("if-modified-since");  

通过这句代码,拿到具体值;
假如判断为不用更新则直接返回304
getResponse().setStatus(HttpServletResponse.SC_NOT_MODIFIED);

并且立即结束返回,不用继续执行;

对于取到的if-modified-since,即是上次存入的Last-Modified,里面的值到是可以很随意,你除了放时间,也可以放memberId;


--------------------------------分隔线 ----------------------------------


    实现问题也解决了;

    最后一个问题,是怎么保证接口,或者页面的动态性;也就是说怎么通过Last-Modified或者if-modified-since来判断页面不需要更新;

    考虑最简单的情况,这个接口或者页面仅提供和用户相关的不同信息,并且该信息一但建立则不会改变;

    那对于此接口,假如参数中包含memberId属性,则一但具有if-modified-since值,则永远返回304;因为对于不同url,浏览器均会进行缓存;

    假如memberId属性在cookie中,url一致,那么,在Last-Modified中存入memberId,判断时于cookie或者session中url比对,相同则认为是正确的缓存返回304;

    现在,新的问题来了,用户的相关信息更新了;

    假如这个更新频率不是那么频繁,那么想办法做个更新机制还是合理的;你需要一个地方在服务端记录用户接口信息的版本号了,从if-modified-since中取得上次的版本号,然后进行比对,如果相同,则返回304;

    在某些情况下,获取更新记录信息要比计算合成完整信息并利用带宽将数据传给客户端代价小得多,此时你可以试下WEB服务动态接口的静态缓存;



   












  • 大小: 20.2 KB
  • 大小: 17.6 KB
  • 大小: 30 KB
  • 大小: 41 KB
  • 大小: 25.2 KB
14
13
分享到:
评论
2 楼 yfyh87 2011-05-05  
鼓浪屿 写道
好厉害呀。。。不错不错,这个功能还是挺有作用的

多谢多谢
1 楼 鼓浪屿 2011-05-05  
好厉害呀。。。不错不错,这个功能还是挺有作用的

相关推荐

    利用客户端缓存对网站进行优化的原理分析第1/2页

    HTTP Compression技术,但客户端缓存往往却被人们忽略了,即使服务器的缓存让你的页面访问起来非常地快,但她依然需要依赖浏览器下载并输出,而当你加入客户端缓存时,会给你带来非常多的好处.因为她可以对站点中访问最...

    Android代码-web资源的本地缓存方案

    CandyWebCache是移动端web资源的本地缓存解决方案,能够拦截webview的请求,并优先使用本地缓存静态资源进行响应,以此来对webview加载页面性能进行优化。 特点: 协议层拦截请求,透明替换响应 静态资源版本控制及...

    Web客户端模似控件集-Ucren

    强缓存 Ucren 采用各种客户端缓存机制,将 20 几k大小的内核完全缓存到客户端,二次打开的时候,不必重新加载内核。 按需载 Ucren 的控件很多,同一个页面上基本不会用到所有的控件,按需加载是一种有效的解决...

    禁用aspx页面的客户端缓存(防止页面被修改)

    但有时这也给我们带来了弊端,比如修改信息的页面,在提交修 改后,再次打开次页面,因为URL并没有改变,因此IE会读取本地缓存,页面显示的仍然是原始信息,这种情况特别容易出现在弹出对话框或窗口进行修改的方 式...

    完美解决客户端webview持有的页面缓存,不会立即释放的问题

    安卓和苹果的客户端开发中,经常会使用到webview,我们一般做法是将webview加入到native页面中。 当我们对页面进行销毁的时候,其中webview持有的HTML页面还会继续存在,加入我们在HTML页面中做了一些监听手机晃动、...

    LCache:可用于 WebApplication 的在线缓存,用于维护客户端缓存

    允许 Web 应用程序在客户端存储数据的库 下面是 LCache 支持的几个特性: 用户的配置时间以允许数据的生命周期 以键值对的形式保存数据 如果不再需要数据,可以在数据到期前将其删除 在单页应用程序中的不同页面...

    禁止浏览器缓存当前文档内容

    缓存提高了浏览器的访问效率,但有时也会带来负面效果,那就是服务器端的内容变化不能被实时地反映到客户端(如动态产生的图片文件和JavaScript脚本文件不能及时更新的问题)。有三个HTTP响应头字段都可以禁止浏览器...

    动态缓存加速软件aicache

    缓存终止(header驱动缓存终止)等功能,让aiCache同步更新一个整体页面或 一个网页元素。 7. 可作为HTTPS终点,把解密的流量发送给原始服务器,从而对HTTPS内容加速。 8. 性能卓越、规模化扩展性强,每秒处理请求26...

    初探浏览器缓存实现原理-提高性能

    当一个客户端请求web服务器, 请求的内容可以从以下几个地方获取:服务器、浏览器缓存中或缓存服务器中。这取决于服务器端输出的页面信息。页面文件有三种缓存状态。 1.最新的:选择不缓存页面,每次请求时都从服务器...

    C#使用memCached实现缓存

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的...

    Memcached内存对象缓存

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的...

    分布式键值缓存系统FirstDB.zip

     @可应用在WEB页面加速。  @构建实时关键信息预测,例交通拥堵预测,道路设计建模。  @公安预警 ,实时环境况监控等实时性较强场景建模。 架构思想:  一致性哈希,主从模型等 模块构成:  智能...

    hinclude:Web的声明式客户端包含

    hinclude.js 厌倦了从模板... HInclude是Web的声明性客户端包含; 它使您可以使用浏览器轻松地构成网页-使您的页面更具模块化,更可缓存且更易于维护。 有关文档和示例,请参见。 如果您对使用Web组件感兴趣,请参阅 。

    10分钟彻底搞懂Http的强制缓存和协商缓存(小结)

    浏览器缓存是浏览器在本地磁盘对用户最近请求过的文档进行存储,当访问者再次访问同一页面时,浏览器就可以直接从本地磁盘加载文档。 所以根据上面的特点,浏览器缓存有下面的优点: 减少冗余的数据传输 减少...

    漂亮的ComponentArtWebUI web界面

    强大的客户端呈现技术:行业中最先进的Web用户界面技术。 深入整合ASP.NET AJAX:最理想的完全应用AJAX框架的控件。 全面的帮助文档和技术支持:提供了完善的产品在线帮助文档和全面的技术支持资源。 企业级服务和...

    Android代码-WebView缓存例子

    做一个webview的页面,功能类似于微信发朋友圈一样,要求能上传本地图片到webview中进行展示,并按用户喜好添加和删除,当用户点击发布的时候,将这些图片上传至阿里云oss,收到oss响应后封装页面信息提交给服务器 ...

    fiddler 2 web调试代理

     通过显示所有的Http通讯,Fiddler可以轻松的演示哪些用来生成一个页面,通过统计页面(就是Fiddler左边的那个大框)用户可以很轻松的使用多选,来得到一个WEB页面的“总重量”(页面文件以及相关js,css等)你也...

    web嵌入到winform中完美显示(CefSharp)

    Cef sharp把B/s包一层,感觉像是一个c/s客户端程序,其中支持: 1. 捕获按键,做对应操作,包括F12,调出控制台调试; 2. 添加缓存功能,指定缓存文件路径; 3. 加载网页,等待时间用 Loading.gif动画代替; 4. 支持...

    Web应用安全:HTTP回应报文.pptx

    响应输出到客户端后,服务端通过该报文头属告诉客户端如何控制响应内容的缓存。 常见的取值有private、public、no-cache、max-age,no-store,默认为private。 private: 客户端可以缓存 public: 客户端和代理服务器...

    Web-Proxy-Server:小型Web代理服务器,能够缓存网页。 这是一个非常简单的代理服务器,它仅了解简单的GET请求,但能够处理各种对象-不仅是HTML页面,而且还包括图像

    Web代理服务器小型Web代理服务器,能够缓存网页。 这是一个非常简单的代理服务器,它仅了解简单的GET请求,但能够处理各种对象-不仅是HTML页面,而且还包括图像。 用于实现的语言是Python 2。编译服务器您如何编译...

Global site tag (gtag.js) - Google Analytics