fetch默认redirect为"follow",自动跳转但隐藏中间过程且不携带认证头;"error"遇重定向立即reject抛typeerror;"manual"返回原始响应供自定义处理。

Fetch 默认会自动跟随重定向(301、302、303、307、308),但行为受 redirect 选项控制,不是“总是跟”或“从不跟”,而是可配置的。
redirect 选项的三种取值及对应行为
在 fetch() 的配置对象中,redirect 字段决定如何处理重定向响应:
-
"follow"(默认):自动发起新请求,使用重定向响应头中的Location,并把最终响应返回给 Promise;中间重定向过程对调用方透明,无法获取跳转链中的中间响应。 -
"error":遇到任何重定向状态码(如 302)立即 reject,抛出TypeError: Failed to fetch(注意:不是 HTTP 错误,是网络层拒绝处理)。 -
"manual":收到重定向响应时不自动跳转,Promise 正常 resolve,返回一个Response对象,其type === "opaqueredirect",且status === 0、headers为空、body为 null —— 这是浏览器的隐私保护机制,防止 JS 读取跨源重定向的 Location 或其他敏感头信息。
重定向时请求方法和 body 的变化规则
不同重定向状态码对后续请求的方法和 body 处理不同,Fetch 遵循 HTTP 规范:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
301 Moved Permanently和302 Found:大多数浏览器(包括 Fetch 实现)会将 POST 转为 GET,且丢弃原始 body(即使你显式设置了body)。 -
303 See Other:强制转为 GET,忽略 body(语义上明确要求客户端用 GET 获取新资源)。 -
307 Temporary Redirect和308 Permanent Redirect:保持原始请求方法和 body 不变(例如 POST 仍为 POST,body 完整发送)。
这意味着:如果你需要确保 POST 请求不被降级为 GET,应优先使用 307 或 308 响应,并确认服务端支持。
如何手动处理重定向(比如记录跳转路径)
若需捕获每次重定向的响应(如调试、审计、自定义跳转逻辑),不能依赖默认 "follow",而应设为 "manual" 并自行发起后续请求:
- 设置
redirect: "manual"发起初始请求。 - 检查响应
response.type === "opaqueredirect"不适用 —— 因为此时response.status === 0,无法读取Location。 - 正确做法是:改用
redirect: "error",捕获 reject,再通过catch中的异常无法拿到响应 —— 所以真正可行的是:服务端配合返回非重定向响应(如 200 + JSON 含 redirect URL),或使用mode: "no-cors"之外的模式(如"cors")并确保服务端允许暴露Location头(通过Access-Control-Expose-Headers: Location),然后用"follow"并监听response.url变化 —— 但 Fetch 本身不提供跳转中间事件。 - 实际项目中,如需完整跳转链,常用替代方案是后端统一返回 200 + 重定向元数据,前端自行
window.location或fetch下一步,绕过浏览器自动重定向。
跨域重定向的限制与注意事项
当重定向涉及跨域时,浏览器会施加额外限制:
- 即使初始请求是 CORS,重定向后的目标如果跨域,且未正确配置 CORS 响应头(
Access-Control-Allow-Origin等),最终响应会被浏览器拦截,JS 无法读取内容(但 Promise 仍可能 resolve,取决于是否触发 CORS 预检失败)。 -
redirect: "manual"模式下,跨域重定向响应的Location头默认不可访问(被屏蔽),除非服务端显式通过Access-Control-Expose-Headers: Location暴露。 - 携带凭据(
credentials: "include")时,重定向目标必须返回Access-Control-Allow-Credentials: true,否则整个请求失败。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










