tomcat中对客户端的缓存机制

    在我们的系统中无时无刻都在使用缓存。而这个缓存可以用在很多地方,比如,数据库查询缓存,hibernate等对数据的缓存,memcached对数据的缓存,系统缓存,浏览器缓存等等。这里不打算深入各个种类的缓存,而是着重强调浏览器端的缓存机制,这个缓存机制主要依靠HTTP协议达成浏览器与服务器缓存之间的协商。而要完成这个机制,与服务器的配合是密不可少的,所以,介绍他们的同时,也会从tomcat的源码来加深认识。

    首先来看最初也是最简单的方式,我们这里简称last-modified方式。这个方式工作原理如下,第一步,客户端需要请求一个资源,假设是index.html;第二步,服务器返回该资源的同时,会在HTTP的响应头附带一个header Last-modified表明该文件的上次修改时间,客户端接到该响应,先将资源缓存,并且记下这个上次修改时间;第三步,每次客户端想要再次请求该资源时,会在HTTP的请求头附带一个header If-Modified-Since,并且附上那个文件的上次修改时间,其目的在于问服务器,上次修改后至今是否又再修改过;第四步,服务器根据该文件的时间戳以及请求头中该文件的上次修改时间来确定到底是否该返回真实文件,如果时间戳大于上次修改时间,说明改过,则读取该文件并返回之,如果时间戳小于上次修改时间,说明没有改过,服务器返回一个HTTP状态码304表示Not modified,客户端看到该状态码,则自动使用浏览器的本地缓存。可以看到,每次浏览器发起请求时,只要缓存有效,则节省了传输文件的带宽跟时间。如下图:


    接下来,我们看看tomcat是如何实现这个机制的。在tomcat中,对动态请求设置Last-Modified是在servlet中service方法中实现的,而且,默认的实现只支持GET方法。getLastModified方法是一个protected方法,默认返回了-1,这意味着如果你想要支持last-modified方式就必须在serlvet类中自己实现getLastModified方法,默认是不支持的(即getLastModified是否返回-1就是是否支持该方式的开关),接下来,如果请求头中有If-Modified-Since,并且这个时间又小于文件的真实修改时间,说明我们需要返回给客户端更新的资源,即再次设置lastModified标记,以及返回该资源(即doGet()),如果If-Modified-Since大于文件的真实修改时间,说明文件自上次修改以来未被修改过&#

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值