当前位置: 首页 > 知识库问答 >
问题:

为什么发送多个选项请求,即使访问控制允许原点设置为*?

冯旭
2023-03-14

我已经构建了一个API(API.example.com),希望它可以从www.example.com访问。com
我还希望它可以从其他域访问

为此,我添加了访问-控制-允许-起源:*

但是当我打开www.example.com时,在所有api请求之前发送了一个预飞行请求(OPTIONS请求)
如何停止多个预飞行请求?我想应该只有一个起飞前的要求,我做错了什么!!!?或者浏览器在每次通话前都要发送飞行前请求是很自然的吗?
注意:我不想使用JSONP,因为我正在使它公开访问访问控制允许起源:*

期权看涨头

Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:accept, authorization
Access-Control-Request-Method:GET
AlexaToolbar-ALX_NS_PH:AlexaToolbar/alxg-3.2
Connection:keep-alive
Host:api.touchtalent.biz
Origin:http://www.example.com
Referer:http://www.example.com/artist/52894/pratim-relekar
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36

期权看涨期权响应

Access-Control-Allow-Headers:origin, x-requested-with, content-type, Authorization
Access-Control-Allow-Methods:PUT, GET, POST, DELETE
Access-Control-Allow-Origin:*
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:163
Content-Type:text/html
Date:Fri, 13 Jun 2014 14:24:55 GMT
Keep-Alive:timeout=5, max=98
Server:Apache/2.2.22 (Ubuntu)
Vary:Accept-Encoding
X-Powered-By:PHP/5.4.6-1ubuntu1.8

获取请求头

Accept:application/json, text/plain, */*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
AlexaToolbar-ALX_NS_PH:AlexaToolbar/alxg-3.2
Authorization:Bearer VtQJqaTGd7YFb8Mee6GfiLwiRrUdt2iCp9ITuiUE
Connection:keep-alive
Host:api.touchtalent.biz
Origin:http://www.example.com
Referer:http://www.example.com/artist/52894/pratim-relekar
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36

获取请求-响应头

Access-Control-Allow-Headers:origin, x-requested-with, content-type, Authorization
Access-Control-Allow-Methods:PUT, GET, POST, DELETE
Access-Control-Allow-Origin:*
Connection:Keep-Alive
Content-Length:1116
Content-Type:application/json
Date:Fri, 13 Jun 2014 14:24:55 GMT
Keep-Alive:timeout=5, max=97
Server:Apache/2.2.22 (Ubuntu)
Status:200
X-Powered-By:PHP/5.4.6-1ubuntu1.8

虽然我不想提供一个URL,因为它会随着开发的进行而中断。但是如果有帮助的话:http://www.touchtalent.biz/home

更新1:
一旦我删除了授权:承载VtQJqaTGd7YFb8Mee6GfiLwiRrUdt2iCp9ITuiUE头,它就停止了多次预飞行请求。
但是删除这个头会破坏oauth实现。我仍然必须防止多次预飞行请求而不删除自定义标头。我该怎么做呢?
更新2:
添加访问控制最大年龄帮助,现在它不发送相同请求的预飞行。但是对于不同的请求(不同的网址)它发送多个OPTIONS请求。

共有2个答案

冉丰茂
2023-03-14

预飞行是由您的内容类型的"应用程序/json"触发的。防止这种情况的最简单方法是在您的情况下将内容类型设置为“文本/普通”。应用程序/x-www. form-urlencoded内容类型也是可以接受的,但是您当然需要适当地格式化您的请求负载。

如果您在进行此更改后仍然看到预飞行,那么Angular可能也在向请求添加X标头。

龚昊然
2023-03-14

您可以尝试添加诸如Access-Control-Max-age之类的标头,以尽量减少重复的OPTIONS请求。这将告诉浏览器缓存飞行前信息。看http://www.w3.org/TR/2008/WD-access-control-20080912/#access-control-max-age

 类似资料:
  • 我将JSON对象存储在Amazon S3中,我想从Javascript直接从S3加载数据。我的GET看起来很普通: 我得到以下错误: 我可以使用curl从S3获取URL,或者直接从浏览器导航到S3。我真的要通过自己的服务器代理所有这些请求吗?

  • 我在从我的网站链接加载字体时遇到问题。在我所看到的server.js中有一个错误,即CORS不在我的标题中。现在,我的问题是如何将标题插入我的server.js有人能帮我吗? 这里是错误 源“我的网站链接”中的字体已被跨域资源共享策略阻止加载:请求的资源上不存在“访问-控制-允许-原点”标头。因此不允许访问原点“http://localhost:3001”

  • 我正在使用的移动应用程序开发中工作。目前我正在使用处理移动应用程序,并且工作正常。(Android和iOS) 我需要在浏览器中使用与相同的应用程序。(使用 HTML5)。但是当我尝试在网站上运行我的应用程序时,我收到此错误: 当搜索专家说使用JSONP时。但是使用相同的XMLRPC方法我可以工作吗? 比如说; 对于登录目的我使用; 它作为一个移动应用程序运行良好。 但当我尝试作为网站运行时,出现<

  • 我对它是如何工作的有一个大致的想法。如果请求的源头有效(允许),则返回相同的ORIGIN值 但我不知道: 对于OPTIONS请求之后的实际请求,我是否需要包括与我返回给客户端的预飞行请求完全相同的访问控制允许源标头?服务器代码应该只在实际请求中存在“ORIGIN”标头时才需要这样做吗?(在下面的代码中,我没有检查请求是OPTIONS/起飞前请求还是实际请求,我假设相同的代码可以适用于两者而没有伤害

  • 我正在用POST测试JS。但是我没有成功。 使用代码: 我得到以下错误: 奇怪的是请求头没有通过以下行正确设置: 请求头如下所示:

  • 问题内容: 我看到以下错误: 使用此代码: 是什么原因引起的,如何解决? 问题答案: 在当前域之外发出ajax请求时,Javascript是受限制的。 例1:您的域名为example.com,并且您想向test.com提出请求=>您不能。 例2:您的域名是example.com,并且您想向inner.example.com发送请求,但是您不能。 例3:您的域名为example.com:80,并且您