- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 Google Cloud Functions 创建了一个 API 端点,并试图从 JS 获取函数中调用它。
我遇到了我很确定与 CORS 或输出格式有关的错误,但我不确定发生了什么。其他一些 SO 问题类似,并帮助我意识到我需要删除 mode: "no-cors"
.大多数人提到在 BE 上启用 CORS,所以我添加了 response.headers.set('Access-Control-Allow-Origin', '*')
- 我在 this article 中了解到的- 确保启用 CORS...但我仍然收到“无法获取”错误。
完整错误(可在下面链接的现场演示中重现)是:
Uncaught Error: Cannot add node 1 because a node with that id isalready in the Store. (This one is probably unrelated?)
Access to fetch at'https://us-central1-stargazr-ncc-2893.cloudfunctions.net/nearest_csc?lat=37.75&lon=-122.5'from origin 'https://o2gxx.csb.app' has been blocked by CORS policy:Request header field access-control-allow-origin is not allowed byAccess-Control-Allow-Headers in preflight response.
GEThttps://us-central1-stargazr-ncc-2893.cloudfunctions.net/nearest_csc?lat=37.75&lon=-122.5 net::ERR_FAILED
Uncaught (in promise) TypeError: Failed to fetch
<---- *** Message ***
表示最近更改的代码部分,给了我这两个错误之一。
function getCSC() {
let lat = 37.75;
let lng = -122.5;
fetch(
`https://us-central1-stargazr-ncc-2893.cloudfunctions.net/nearest_csc?lat=${lat}&lon=${lng}`,
{
method: "GET",
// mode: "no-cors", <---- **Uncommenting this predictably gets rid of CORS error but returns a Opaque object which seems to have no data**
headers: {
// Accept: "application/json", <---- **Originally BE returned stringified json. Not sure if I should be returning it as something else or if this is still needed**
Origin: "https://lget3.csb.app",
"Access-Control-Allow-Origin": "*"
}
}
)
.then(response => {
console.log(response);
console.log(response.json());
});
}
后端代码:
import json
import math
import os
import flask
def nearest_csc(request):
"""
args: request object w/ args for lat/lon
returns: String, either with json representation of nearest site information or an error message
"""
lat = request.args.get('lat', type = float)
lon = request.args.get('lon', type = float)
# Get list of all csc site locations
with open(file_path, 'r') as f:
data = json.load(f)
nearby_csc = []
# Removed from snippet for clarity:
# populate nearby_csc (list) with sites (dictionaries) as elems
# Determine which site is the closest, assigned to var 'closest_site'
# Grab site url and return site data if within 100 km
if dist_km < 100:
closest_site['dist_km'] = dist_km
// return json.dumps(closest_site) <--- **Original return statement. Added 4 lines below in an attempt to get CORS set up, but did not seem to work**
response = flask.jsonify(closest_site)
response.headers.set('Access-Control-Allow-Origin', '*')
response.headers.set('Access-Control-Allow-Methods', 'GET, POST')
return response
return "No sites found within 100 km"
上面代码片段的更完整上下文:
localhost:3000
上运行它时遇到了同样的问题。 ,当然在 prod 中也会有这个在我自己的个人领域。
'https://o2gxx.csb.app' has been blocked by CORS policy: Request header field access-control-allow-origin is not allowed by Access-Control-Allow-Headers in preflight response.
)但我想添加
response.headers.set('Access-Control-Allow-Origin', '*')
会解决的。我需要在 BE 上更改其他内容吗?在FE上?
最佳答案
删除前端代码中添加 Access-Control-Allow-Origin
的部分标题。
从不添加 Access-Control-Allow-Origin
作为前端代码中的请求 header 。
唯一的影响是负面的:它会导致浏览器进行 CORS 预检 OPTIONS
即使在来自前端代码的实际(GET
、POST
等)请求不会触发预检的情况下,也会发出请求。然后预检将失败并显示以下消息:
Request header field Access-Control-Allow-Origin is not allowed by Access-Control-Allow-Headers in preflight response
Access-Control-Allow-Headers: Access-Control-Allow-Origin
,否则它将失败。响应头。
Access-Control-Allow-Origin
在
Access-Control-Allow-Headers
响应头值。如果这最终使事情正常进行,那么您实际上只是在解决错误的问题。因为真正的解决方法是:从不设置
Access-Control-Allow-Origin
作为请求头。
Access-Control-Allow-Origin
似乎合乎逻辑。无论是在请求中还是在响应中,所以这应该比仅仅在响应中更好”——但它实际上比只在响应中设置它更糟糕(出于上述原因)。
Access-Control-Allow-Origin
只是一个响应头,而不是请求头。您只想在服务器端响应代码中设置它,而不是前端 JavaScript 代码。
Origin
标题。您也永远不想尝试在前端 JavaScript 代码中设置该 header 。
Access-Control-Allow-Origin
的情况不同 header ,
Origin
实际上是一个请求头——但它是一个完全由浏览器控制的特殊头,浏览器永远不会允许你的前端 JavaScript 代码设置它。所以永远不要尝试。
关于javascript - “Request header field Access-Control-Allow-Origin is not allowed by Access-Control-Allow-Headers in preflight response” 尽管 CORS 配置有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62569594/
我尝试访问此 API click here for more info POST https://api.line.me/v2/oauth/accessToken 但总是得到错误: XMLHttpRe
我在掌握 CORS 概念时遇到问题... 我认为同源策略保护应用程序不会对“不受信任的域”进行 ajax 调用。所以, mydomain.com 向 发出 ajax 调用somedomain.com
一个技术性很强的问题,可能只有了解浏览器内部结构的人才能回答...... 浏览器缓存 CORS 预检响应的准确程度如何(假设在对 OPTIONS 预检请求的响应中返回了 Access-Control-
我一直在阅读 CORS以及它是如何工作的,但我发现很多事情令人困惑。例如,有很多关于事情的细节,比如 User Joe is using browser BrowserX to get data fr
在 OWASP site 上看到这个矛盾,我感到很困惑。 CORS 备忘单: 使用 Access-Control-Allow-Credentials: true 响应 header 时要特别小心。将允
我们无法在飞行前恢复使用 cors:任何帮助都非常感谢 ==========错误========================== About to connect() to localhost p
跨域请求字体文件时,您必须确保允许请求域使用 CORS header 访问字体文件: 访问控制允许来源 访问控制允许凭据 然而,这在请求图像时不是必需的,无论是对于 img元素或 background
CORS 规范没有说明服务器应如何响应无效的 CORS 请求。例如,如果请求 Origin 无效,则 CORS spec states :“终止这组步骤。请求超出了本规范的范围。”其他错误情况也有类似
我在理解同源策略和“解决”它的不同方法时遇到了一些麻烦。 很明显,同源策略是作为一种安全措施而存在的,因此来自服务器/域的一个脚本无法访问来自另一个服务器/域的数据。 也很明显,有时能够打破此规则很有
我正在尝试使用 cloudformation 在 API Gateway 中部署 API。这些方法需要启用 CORS,我遵循此处的模板 Enable CORS for API Gateway in C
我正在构建一个使用 CORS 的 REST 应用程序。每个 REST 调用都是不同的,我发现获取预检 OPTIONS 调用会产生很大的开销。有没有办法缓存并应用预检选项结果,以便对同一域的任何后续调用
我正在将我的 WebApi 升级到 MVC6。 在 WebApi 中,我可以拦截每个 HTTP 请求,如果是预检,我可以用浏览器可以接受的 header 进行响应。 我正在尝试找出如何在 MVC6 W
假设一个 CORS 预检请求进来了,但它为一个或多个 Access-Control-Request-* 指定了一个不受支持的值。标题。服务器应该如何将其传达回浏览器? 一些例子: 浏览器发送带有 Ac
问题中的一切。 附加信息: 使用 Win 10,GraphDB 免费,9.1.1 • RDF4J 3.0.1 • Connectors 12.0.2 我在控制台 => 设置中添加了 graphdb.w
我正在尝试通过 jQuery 调用 Sonar 网络服务之一。由于调用是跨域进行的,因此调用在 Chrome 上失败并出现以下错误: 请求的资源上不存在“Access-Control-Allow-Or
我想使用 NestJs api,但我在每个 fetch 中都收到相同的错误消息: Access to fetch at 'http://localhost:3000/articles' from or
我不确定这是否属于这里,但我在开发我的 svelte 应用程序时遇到了问题。 在开发过程中,它目前在独立服务器上运行(遵循使用 rollup 和 sirv 的指南)并针对不同端口上的后端 API。 稍
如果在服务器上正确设置 CORS 以仅允许某些来源访问服务器,这是否足以防止 XSRF 攻击? 最佳答案 更具体地说,很容易错误地认为如果 evil.com 由于 CORS 无法向 good.com
我在 Istio 入口上启用 CORS 时遇到问题。正如 Istio Ingress 文档所述,“ingresskubernetes.io”注释将被忽略。是否可以在 Istio 入口上启用 CORS?
我在 Istio 入口上启用 CORS 时遇到问题。正如 Istio Ingress 文档所述,“ingresskubernetes.io”注释将被忽略。是否可以在 Istio 入口上启用 CORS?
我是一名优秀的程序员,十分优秀!