动态添加时间戳(如 _t)是 javascript 中防止 get 请求缓存的有效策略,可通过 url 拼接或 axios 拦截器实现,并建议服务端忽略该参数。

在 JavaScript 接口请求中动态添加时间戳(如 timestamp 或 _t)是一种常见且有效的防缓存策略,尤其适用于 GET 请求。浏览器和中间代理可能对相同 URL 的响应进行缓存,加上唯一时间戳可确保每次请求 URL 都不同,从而绕过缓存。
GET 请求中手动拼接时间戳参数
适用于原生 fetch、XMLHttpRequest 或封装的请求函数。只需在 URL 查询参数末尾追加一个毫秒级时间戳:
- 用
Date.now()获取当前毫秒时间戳(推荐,简洁无依赖) - 避免使用
new Date().getTime()(效果相同,但略冗长) - 注意 URL 已有查询参数时,用
&追加;无则用?
示例(fetch):
fetch(`/api/data?name=jack&_t=${Date.now()}`)统一拦截请求(如 Axios 全局配置)
若项目使用 Axios,可在请求拦截器中自动为所有 GET 请求添加时间戳,避免重复写逻辑:
- 检查请求方法是否为
get - 解析原始 URL,安全地追加
_t=时间戳(推荐用 URL 构造 + URLSearchParams) - 不建议直接字符串拼接,以防已有哈希(
#)或编码问题
示例:
axios.interceptors.request.use(config => {if (config.method === 'get') {
const url = new URL(config.url, window.location.origin);
url.searchParams.set('_t', Date.now());
config.url = url.toString();
}
return config;
});
服务端配合:忽略该参数(非必须但推荐)
时间戳仅用于打破缓存,不应影响业务逻辑:
- 后端路由或控制器应主动忽略
_t、timestamp等防缓存参数 - 不要将其作为业务字段参与校验或存储
- 某些网关或 CDN 可能支持自动剥离此类参数,需视环境配置
其他可靠替代方案(按优先级参考)
时间戳简单有效,但不是唯一方式。以下方式同样实用,可根据场景选用:
-
设置请求头:
Cache-Control: no-cache或Pragma: no-cache(对浏览器生效,但部分代理可能忽略) -
使用随机数:
Math.random()(适合调试,但缺乏时间序,不利于排查) -
禁用 fetch 缓存:
cache: 'no-store'(现代 fetch 支持,更语义化,但 IE 不支持)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











