解决HTTP数据不更新问题——no-cache在HTTP通信协议中的应用

所属分类: 软件教程 / 经验技巧 阅读数: 1896
收藏 0 赞 0 分享
转贴请注明出处:http://blog.csdn.net/froole
HTTP服务器向客户端返回的头信息中可以包含Cache-Control:no-cache信息,意为“数据内容不被储存”。
很多WEB程序设计中,通常并不需要考虑这一点。但是,对相同URL的请求,并需要动态数据时,就需要程序员对服务器返回头信息的进行修改。
例如,通过Ajax向同一个URL发送请求、页面访问同一个URL并需要动态显示页面内容。
在不对服务器所返回头信息做任何修饰的情况下,Cache-Control可能不被添加,此时,浏览器将缓存从服务器取得的信息。如果再次访问网页,浏览器会直接读取缓存数据,而非访问HTTP服务器,如果通过代理再次访问网页,那么,代理服务器将会直接向浏览器返回一个302状态,命令浏览器从缓存读取数据。
本文想定开发人员遭遇以下两种情况:
1.Ajax中,需要通过一个URL适时提取动态数据(例如,使用DWR提取某个POJO的数据);
2.在一个网页中,通过对某个连接的重复访问(发送请求),动态读取不同的页面数据(例如,根据某个项目的列排序)。
如果可以在设计阶段,就已经考虑到通过URL参数,改变URL,倒也不需要考虑缓存的问题。但是,如果URL相同,就会出现相应数据更新迟缓的现象。例如,如果访问速度相对较快,第一次访问和第二次访问的数据,在同一个客户端是相同的。也就是HTTP数据不更新/更新迟缓现象。
解决此问题的方法,就是向服务器的返回头信息“Cache-Control:no-cache”。
PHP的情况,可以向相应的返回处理中添加以下代码:
header("Cache-Control: no-cache");
header("Cache-Control: no-cache");
Java的情况,可以定义相应的URL,通过操作HttpServletResponse定义头信息,如下:

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
((HttpServletResponse) response).setHeader("Cache-Control", "no-cache");
chain.doFilter(request, response);
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
((HttpServletResponse) response).setHeader("Cache-Control", "no-cache");
chain.doFilter(request, response);
}
以上两个例子,虽然是在不同语言下的实现,但是从HTTP协议通信的角度,其效果是类似的。
使用Cache-Control需要注意的
通过控制Cache-Control头信息,可以让浏览器(代理服务器)及时更新请求数据。但是要注意的是,只有在HTTP1.1下才Cache-Control被支持。
当然,HTTP的版本在大多数WEB开发中,同样不需要考虑。而目前的主流浏览器也都是默认支持HTTP1.1。但是,如果使用IE6,并且通过代理服务器访问网站的时候,浏览器的HTTP请求就要变成HTTP1.0了。这个时候,Cache-Control就会失效,而且无法从服务器端控制HTTP协议版本。只能通过浏览器的设定来解决,方法是,通过IE详细设置中的HTTP1.1设定来解决。如果可能,也可以把目标服务器排除在代理目标之外。
更多精彩内容其他人还在看

12306双向核验该怎么做?电脑手机端双向验证的详细教程

12306双向核验该怎么做?现在使用12306购买火车票需要双效验证,之前我们也发过12306双向验证的教程,今天这篇文章是12306双向验证手机验证和电脑验证最全版本,需要的朋友可以参考下
收藏 0 赞 0 分享

航天纪念币/纪念钞开启预约 10元硬币100元钞票(内附预约地址)

26日,将法相中国航天普通纪念币一枚(10元)、中国航天纪念钞一张(100元),现在已经开始预约,本文内容附预约地址,喜欢收集的朋友可以进来直接预约,本次预约以后,将于12月14-16号发行
收藏 0 赞 0 分享

12306再放大招 新用户注册需要手机双向验证

之前注册的朋友都知道,注册12306很方便,但是,今天起注册12306的新用户需要进行手机双向验证,为什么要这么麻烦呢?这一新举措为新用户注册增加了一道步骤,但可以有效防止用户身份信息被抢注,如果被抢注册也可以完美解决,详细内容请看下文
收藏 0 赞 0 分享

怎么通过网络银行在线预定中国航天纪念币(25日截止)?

怎么通过网络银行在线预定中国航天纪念币?昨天中国人民银行发型了中国航天纪念币,从11月10日预订到11月25日截止预订,但是很多朋友不知道该怎么预订,下面分享预订航天纪念币的图文教程,和预订连接,需要的朋友可以参考下
收藏 0 赞 0 分享

2015年新版百度地图怎么查询地方坐标? 百度地图拾取坐标的方法

2015年新版百度地图怎么查询地方坐标?百度地图最近刚刚改版了,改版以后最大的改变就是查询坐标的位置改变了,该怎么拾取坐标呢?下面分享2015年最先百度地图的使用方法
收藏 0 赞 0 分享

百度地图中怎么同时标注多个地点?

百度地图中怎么同时标注多个地点?旅游的时候使用百度地图查看了几个想去的旅游景点,想标注起来,这样就能方便的找到自己想去的位置,但是怎么同时标注多个地方呢?下面我们看看百度地图地方标注的使用方法
收藏 0 赞 0 分享

搜狗输入法怎样换行? 搜狗输入法文字换行的技巧

搜狗输入法怎样换行?现在很多人使用搜狗输入法输入文字,文字怎么换行呢?下面我们就来看看搜狗输入法文字换行的技巧
收藏 0 赞 0 分享

百度图片打不开怎么回事?百度图片打不开解决方法

百度图片打不开怎么回事?很多网友在查找图片时突然打不开百度图片,却又不知道怎么解决,其实解决方法很简单的,下面小编就为大家介绍百度图片打不开方法,来看看吧
收藏 0 赞 0 分享

iTunes连接失败显示未知错误0xE8000084的详细解决办法

iTunes发生未知错误0xE8000084怎么办?iTunes最新版本连接iPhone6,结果没有反应,连接失败,并且弹出提示窗口: “iTunes发生未知错误0xE8000084”,下面分享这个问题的解决办法,需要的朋友可以参考下
收藏 0 赞 0 分享

百度怎么使用财富值换取百度砖礼品?

百度怎么使用财富值换取百度砖礼品?百度砖就是印有百度logo标注的2块有机玻璃制作组合而成的物品,是百度的一种奖品,用百度财富值就可以换取,下面分享详细的换取教程,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多