首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >获取API、自定义请求头、CORS和跨源重定向。

获取API、自定义请求头、CORS和跨源重定向。
EN

Stack Overflow用户
提问于 2016-11-13 18:00:31
回答 1查看 13.9K关注 0票数 9

我需要在浏览器中使用自定义的请求头制作一个HTTP请求,并在其流进时处理结果。对于此,Fetch API是非常理想的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fetch('https://example.com/resource', {
  method: 'GET',
  headers: {
    'X-Brad-Test': 'true'
  },
  cache: 'no-store',
  mode: 'cors'
}).then((res) => {
  const reader = res.body.getReader();
  // etc.
});

这个很好用。由于有自定义标头,浏览器将带有选项请求的请求预先发送到/resource.我已将服务器配置为使用204 No Content和以下头进行响应:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Access-Control-Allow-Headers: X-Requested-With, Range, If-Range, X-Brad-Test
Access-Control-Allow-Origin: *

浏览器对此很满意,然后发出GET请求,服务器返回带有数据的200 OK,浏览器允许我访问响应头和正文。

当有一个重定向时,问题就出现了。OPTIONS请求与204 No Content和前面相同的头一起成功。浏览器发出正确的GET请求,并在服务器上发送带有Location:头的302。Chrome引发以下错误:

Fetch API无法加载https://example.com/resource。CORS策略阻止了从“https://example.com/resource”重定向到“http://some-other-origin/resource”:请求需要飞行前,这是不允许跟随跨原点重定向的。

这是出乎意料的,在我看来是荒谬的。我希望浏览器遵循重定向,并为这个新的位置执行另一个飞行前请求,但它没有这样做。

更奇怪的是,我可以在客户端进行一些黑客攻击。我可以在不使用自定义标头的情况下发出HTTP请求,通过查看Response对象,找出重定向后的结束位置,然后使用自定义标头在新目标处发出第二个请求。当然,这在所有情况下都不起作用,我也不想依赖这个黑客。我宁愿找个合适的方法。

两个问题:

  • 允许客户端遵循重定向的正确方法是什么?我可以使用某种Access-Control-*头吗?
  • 为何会有这种限制呢?什么安全问题是防止不跟踪和运行飞行前对以下网址?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-14 07:45:29

支持重定向到需要预飞行的请求是对Fetch (定义CORS)的最新更改。

https://github.com/whatwg/fetch/commit/0d9a4db8bc02251cc9e391543bb3c1322fb882f2

我相信有些实现已经开始调整它们的实现,但是这需要一些时间才能到达每个人。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40580913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文