想问一个关于浏览器缓存的问题。
我知道浏览器有强制缓存和协商缓存两种方式,都是可以通过服务器设置的头信息来设置的。而且好像jquery的ajax的配置里也有一项cache来配置。
那么其实ajax是通过何种方式来禁止缓存的?一般可不可以在自己的页面或ajax请求里通过设置请求的哪些项来实现禁止缓存?
想问一个关于浏览器缓存的问题。
我知道浏览器有强制缓存和协商缓存两种方式,都是可以通过服务器设置的头信息来设置的。而且好像jquery的ajax的配置里也有一项cache来配置。
那么其实ajax是通过何种方式来禁止缓存的?一般可不可以在自己的页面或ajax请求里通过设置请求的哪些项来实现禁止缓存?
1 回答962 阅读✓ 已解决
1 回答669 阅读✓ 已解决
1 回答1.4k 阅读
2 回答888 阅读
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的缓存逻辑,并且将请求回来的数据替换缓存中的内容。