ie浏览器对get请求存在强缓存机制,相同url会直接返回缓存结果而不发起新请求,导致ajax数据陈旧;核心解法是使url唯一(如添加date.now()时间戳参数)或服务端设置cache-control: no-cache等响应头,jquery项目可全局启用$.ajaxsetup({cache:false})。

IE浏览器对GET请求有强缓存机制,相同URL会直接返回缓存结果,不发新请求——这导致Ajax获取的数据始终是旧的。核心解决思路是让每次请求的URL“看起来不同”,或明确告诉浏览器不要缓存。
在URL末尾添加时间戳参数
这是最常用、兼容性最好的客户端方案。利用当前毫秒时间确保每次请求URL唯一:
- jQuery写法:`$.get("api/data?ts=" + Date.now(), callback)`
- 原生fetch写法:`fetch("api/data?ts=" + Date.now())`
- XMLHttpRequest写法:在open前拼接时间戳,如 `xhr.open("GET", "api/data?ts=" + Date.now())`
注意避免使用Math.random()——它可能重复,而Date.now()在毫秒级几乎不会冲突。
全局禁用AJAX缓存(jQuery项目推荐)
如果项目大量使用jQuery的$.ajax、$.get、$.load等方法,直接设置一次全局配置即可生效:
- 在页面初始化时调用:
$.ajaxSetup({ cache: false }); - 该设置会让jQuery自动为所有GET请求添加
_=[timestamp]参数,并设置请求头If-Modified-Since: 0 - 适用于jQuery 1.2+,不影响POST请求,也不影响其他库
服务端配合禁用缓存响应头
仅靠前端加参数治标,服务端主动声明不缓存更彻底:
- 后端接口响应中添加HTTP头:
Cache-Control: no-cache, no-store, must-revalidate - Node.js(Express)示例:
res.set("Cache-Control", "no-cache") - .NET Core示例:
Response.GetTypedHeaders().CacheControl = new Microsoft.Net.Http.Headers.CacheControlHeaderValue { NoCache = true };
这样即使用户手动刷新或重发相同URL,浏览器也不会复用缓存。
补充:避免踩坑的细节
有些做法看似合理,实际效果有限或有副作用:
- 仅用
Math.random()不够可靠,重复概率虽小但存在;优先用Date.now()或performance.now() - 设置
async: false不能解决缓存问题,只影响执行顺序 - 把GET改成POST能绕过缓存,但违背REST语义,且需后端适配,不建议作为常规解法
- IE11及Edge已基本修复此问题,重点适配IE8–IE10即可
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











