欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

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

程序员文章站 2022-04-13 12:14:17
解决HTTP数据不更新问题——no-cache在HTTP通信协议中的应用...
转贴请注明出处: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设定来解决。如果可能,也可以把目标服务器排除在代理目标之外。
解决HTTP数据不更新问题——no-cache在HTTP通信协议中的应用