angular - Angular cors 问题:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态
问题描述
我有一个 Angular 8 应用程序,它向托管在 IIS 服务器上的 Flask REST API 发出 POST 请求(使用 Windows Authntication)。问题是每次我从我的角度代码发出 POST 请求时都会收到 CORS 错误:
Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
当我直接从浏览器直接调用它们时,api 的工作正常问题是当我从我的 angular 项目中调用它们时。
我使用了 flask-CORS 库:
cors = CORS(app, resources={r"/*": {"origins": "*"}})
@app.route('/', methods=['GET', 'POST'])
@cross_origin(origin='*', headers=['Content-Type', 'Authorization'], supports_credentials=True)
def home():
"""
Returns template for Home page .
"""
return "<h1>Home Page</h1>"
我在我的 IIS 服务器中设置了这些 HTTP 响应标头:
Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
当我检查网络选项卡时,我得到 CORS 错误而不是状态 401,所以我认为该错误不是身份验证问题。
我经历了多个stackoverflow问题,但所有问题都处理ASP.net,少数处理flask,他们都提到在IIS服务器中设置标题,但我的问题仍未解决。
请指导我这...
编辑
这是我的响应标头:
Provisional headers are shown
Accept: application/json, text/plain, */*
content-type: application/json
解决方案
当您发出 POST 请求时,浏览器会自动发出预检 OPTIONS 请求。OPTIONS 请求的目的是验证您是否有权发出 POST 请求。
您的问题有两种解决方案:
(1) 在您的服务器上设置 CORs 标头以允许来自其他域的请求 (2) 将您的服务器设置为代理请求 - 这会绕过浏览器,并且由于只有浏览器强制执行 CORS,因此您不再需要服务器上的 CORS 标头。
方法 (1) 您可以测试 COR 标头是否在您的浏览器网络选项卡上按预期通过。可能,您还需要支持 OPTIONS 预检方法。
方法 (2) 更安全,但工作量更大,因为您还需要在产品服务器上进行设置(如果您有的话)。
一篇关于 Angular 代理的文章在这里... https://medium.com/bb-tutorials-and-thoughts/angular-how-to-proxy-to-backend-server-6fb37ef0d025 ... 但我确信有更好的文章,只是搜索它!
一切顺利 :)
推荐阅读
- node.js - 猫鼬连接的选项
- html - 如何使 img 的行为与背景图像相同?
- python - 如何绘制圆形与海龟图形的组合?
- javascript - Redux 状态在一个组件的 TextField 中更新,但在另一个具有相同 TextField 的组件中没有更新
- spring - Hibernate:TransientPropertyValueException:获取实体时对象引用了未保存的瞬态实例
- wcf - WCF - 将大数据集返回给客户端
- nginx - 如何配置 nginx 以使用匹配给定模式的子路径重定向
- algorithm - 查找从矩阵顶行到底行的所有路径的简单方法
- android - 是否需要 Android 设备来实现 RAW_PRIVATE?
- android - Firebase crashlytics 不适用于 Android