cors - 如何从不同的域调用 Vapor?
问题描述
我只有一个简单的路线。BE和FE在不同的域,如何从FE调用BE得到响应?FE 是反应。
我尝试添加此处指定的设置:https ://github.com/vapor/documentation/blob/master/3.0/docs/vapor/middleware.md没有任何运气。
FE 拒绝没有 HTTP 状态错误代码的调用。清除浏览器中的缓存。
我试图将这些行添加到路线中,但没有运气:
public func routes(_ router: Router) throws {
router.grouped(CORSMiddleware()).post([Page].self, at: "/releases") { (req, pages) -> Future<[Page]> in
req.response().http.headers.add(name: "Access-Control-Expose-Headers", value:"Access-Control-Allow-Origin")
req.response().http.headers.add(name: "Access-Control-Allow-Origin", value:"*")
当从 BE 调用 BE 时Postman
,它会起作用,而不是从 FE 调用。断点甚至没有被 FE 击中。
我在浏览器中看到一些错误,而 BE 根本没有响应:
解决方案
文档说:
鉴于抛出的错误会立即返回给客户端,因此
CORSMiddleware
必须在ErrorMiddleware
;之前列出 否则返回的 HTTP 错误响应将不带 CORS 标头,并且无法被浏览器读取。
因此,您必须在CORSMiddleware
之前注册,ErrorMiddleware
如下所示:
var middlewares = MiddlewareConfig()
let corsConfiguration = CORSMiddleware.Configuration(
allowedOrigin: .all,
allowedMethods: [.GET, .POST, .PUT, .OPTIONS, .DELETE, .PATCH],
allowedHeaders: [.accept, .authorization, .contentType, .origin, .xRequestedWith, .userAgent, .accessControlAllowOrigin]
)
let corsMiddleware = CORSMiddleware(configuration: corsConfiguration)
middlewares.use(corsMiddleware)
middlewares.use(FileMiddleware.self)
middlewares.use(ErrorMiddleware.self)
services.register(middlewares)
另外值得注意的是,您应该只在您的蒸汽应用程序中或直接在您的服务器上配置访问控制检查,例如在 NGINX 配置中。如果两者都设置,访问控制将失败。
推荐阅读
- javascript - javascript上数组切片方法的奇怪行为
- powerbi - 如何在 Power BI 中添加自定义列
- c - 如何在 C/C++ 中显示矩阵并能够正确打印出矩阵的每个元素?
- django-rest-framework - Django Rest Framework:使用 ListField 创建序列化程序会导致循环依赖错误
- c++ - 如何浏览 vtable 的方法?
- javascript - 使用 VueJS 更新对象中的多个道具时如何引起反应?
- azure - 适用于 Mac 的 Azure Azcopy 无法上传
- html - 如何将整个 SVG 向右或向左移动?
- python - 在元组值中访问用户在 python 中输入的值的元组
- module - 无法在 omnetpp 中显示子模块向量