浏览器缓存问题

想问一个关于浏览器缓存的问题。

我知道浏览器有强制缓存和协商缓存两种方式,都是可以通过服务器设置的头信息来设置的。而且好像jquery的ajax的配置里也有一项cache来配置。

那么其实ajax是通过何种方式来禁止缓存的?一般可不可以在自己的页面或ajax请求里通过设置请求的哪些项来实现禁止缓存?

阅读 3.3k
1 个回答

cache-control在响应头中可以使用,也可以在请求头中使用。强制缓存、协商缓存,都是http协议层面的规范,在技术实现上它们要基于浏览器和服务器各自的技术实现。我们的大部分编程都是通过服务器端的程序来实现这套缓存协议,而在客户端,浏览器是由厂商开发的,大部分浏览器也都实现了这些协议。

jquery的ajax中设置cache:true,则是遵循这种协议,在浏览器支持的情况下,ajax发出的请求中包含了基于浏览器的cache-control信息。而当你把cache设置为false时,请求头的cache-control也要基于浏览器,是否实现请求头中的no-cache,全由浏览器说了算,因此即使你在ajax中提供了cache:false选项,浏览器发出的请求也不一定遵循这中设定。

从服务端来看,即使来自浏览器的请求包含Cache-Control: no-cache的请求头,你的程序代码也可以选择忽略,因为大部分情况下,服务器端并不遵循严格的no-cache策略,这和安全有关。

所以,对于jquery的ajax而言,cache选项并没有什么暖用,只有在最理想的的浏览器环境和服务端编程下,才能保证你的这项设置是有效的。如果你想要强制实现ajax的缓存,最好的办法,是另写一套自己的缓存机制。一般思路如下:

1.在本地构建一个缓存类
2.当ajax请求发出之前,检查缓存类中对应的url+params是否已经保存了内容,如果有是否过期。在保存了内容,且没过期的情况下,直接将内容以Deferred的形式返回。否则才发出ajax请求。
3.构建一个请求类来实现2的逻辑,并在请求类中提供强制请求的选项,当强制请求时,直接跳过2的缓存逻辑,并且将请求回来的数据替换缓存中的内容。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进