`
yfyh87
  • 浏览: 35530 次
  • 性别: 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  
好厉害呀。。。不错不错,这个功能还是挺有作用的

相关推荐

    实现在客户端的页面缓存

    客户端缓存,也称为浏览器缓存,是Web浏览器为加快页面加载速度而存储的部分网页资源,如HTML、CSS、JavaScript文件、图片等。当用户再次访问同一页面时,浏览器会先从缓存中加载这些资源,而不是重新向服务器请求,...

    web项目页面缓存清除,不用每次刷新浏览器

    8. **客户端缓存策略**:除了HTTP缓存,还可以使用localStorage、sessionStorage等Web存储技术来实现客户端缓存,但这些也需要有对应的清除策略。 9. **预加载和预读取**:预加载可以预先下载用户可能需要的资源,...

    jsp 页面缓存

    除了服务器端缓存,还可以结合客户端缓存(如浏览器缓存)来进一步优化。客户端缓存通常依赖于HTTP头信息,服务器通过设置合适的缓存策略,可以让浏览器自动缓存静态资源,如CSS、JavaScript文件和图片。 总结来说...

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

    总结来说,客户端缓存通过Last-Modified和ETag机制,结合合理的缓存策略,有效地减少了网络流量,提高了页面加载速度,增强了用户满意度。理解并熟练运用这些技术,是优化Web应用性能的关键步骤。

    ASP.NET缓存剖析

    在ASP.NET中,缓存分为客户端缓存和服务器端缓存。 客户端缓存主要涉及到浏览器的缓存机制。当用户首次访问一个网页时,浏览器会下载所有静态资源(如图片、CSS和JavaScript文件),并将它们存储在本地。随后的访问...

    禁用html页面的缓存

    这里的关键在于使用`Response.CacheControl`属性设置为`no-cache`来禁止客户端缓存,并通过`Response.Expires`属性设置为一个较大的负值(如-1000),来确保代理服务器也不会缓存该页面。 #### PHP页面的缓存禁用...

    C# 系统缓存全解析

    缓存分为客户端缓存和服务器端缓存。 1. 客户端缓存: 客户端缓存主要存在于用户的本地浏览器中,如Internet Explorer。当用户访问网站时,浏览器会存储静态文件(如图片、CSS和JavaScript),以便在后续访问时...

    PB11[1].5_WEB客户端编程技巧

    1. **数据窗口对象的appendedhtml属性**:这个属性允许开发者将DHTML、JavaScript等动态内容嵌入数据窗口,使得在WEB环境中的界面表现更加丰富和灵活。通过修改appendedhtml,可以实现诸如透明度、垂直居中、渐变...

    asp.net缓存(页面输出缓存和应用程序缓存)

    ASP.NET缓存技术是提升Web应用性能的关键策略之一,它主要分为页面输出缓存和应用程序缓存两大类。这两种缓存机制旨在减少服务器处理请求的时间,降低数据库负载,并且提高用户体验,通过存储已经生成的HTML页面或...

    缓存应用程序页面和数据

    客户端缓存,如浏览器缓存,存储在用户本地,主要用于减少网络传输,提高页面加载速度。HTTP协议支持多种缓存机制,如ETag和Last-Modified,用于验证资源是否过期。 在C#中实现数据缓存,可以使用多种框架和库,如...

    web页面缓存可用.pdf

    网页缓存是一种优化Web应用程序性能的技术,通过存储用户访问过的页面内容,当用户再次请求相同页面时,可以从缓存中直接读取,避免了重复的网络传输,从而加快页面加载速度,减少服务器负载。在本文档中,我们将...

    利用javascript缓存页面部件

    JavaScript作为客户端脚本语言,可以通过多种方式实现页面部件的本地缓存。 1. **浏览器本地存储** - **Cookie**: 虽然Cookie是最早的本地存储方式,但它主要用于存储较小的数据量(通常4KB)。不过,通过设置过期...

    如何解决缓存问题及如何设置缓存

    客户端缓存是指浏览器在本地缓存Web页面的内容,以便在下次访问时可以快速加载。而服务器端缓存是指Web服务器在内存中缓存Web页面的内容,以便在下次访问时可以快速响应。 解决缓存问题的方法 解决缓存问题的方法...

    Web客户端技术 实例

    JavaScript是Web客户端的主要脚本语言,用于实现动态交互。它可以操作DOM(文档对象模型),改变HTML元素的属性,处理用户事件,进行AJAX异步通信等。ES6(ECMAScript 2015)的推出,为JavaScript提供了更现代的语法...

    J2EE WEB缓存技术详解.doc

    - **OSCache**:更倾向于页面级别的缓存,主要用于缓存整个页面或页面的一部分,缓存数据可能存储在客户端,使用标签来定义缓存内容和有效期。这种方式可以减轻服务器负担,但如果用户频繁清除浏览器缓存,可能会...

    JSP页面缓存的简单实现 (可用于 content-type 为字符类型的JSP页面).zip

    在JSP页面缓存的实现中,通常有两种策略:服务器端缓存和客户端缓存。服务器端缓存是指在服务器上存储预生成的HTML页面,当收到请求时,直接返回缓存的页面,而无需再次执行JSP。客户端缓存则通过设置HTTP响应头中的...

    PHP禁止缓存如何禁止页面缓存

    2. **页面缓存**:特定于Web应用,指将网页内容的副本保存在客户端(如浏览器),以便下次访问时更快地加载页面。 3. **HTTP头部**:HTTP协议中的请求和响应都包含头部信息,用于传输额外的信息,例如内容类型、编码...

    举例理解Ruby on Rails的页面缓存机制

    - **客户端 cookie**:将用户状态存储在客户端 cookie 中,然后通过 JavaScript 根据 cookie 内容动态修改页面元素。这种方式避免了每次请求都与 Rails 应用交互,但不适用于存储敏感信息。 在 ChangingThePresent...

Global site tag (gtag.js) - Google Analytics