CORS(Cross-Origin Resource Sharing),跨原始资源共享。Vapor默认使用CORSMiddleware
实现了一定程度的跨资源共享。
“CORS是允许真正开放性跨域访问的规范。如果你的服务器提供了公共资源,请在通用的JavaScript驱动的浏览器中借助CORS进行访问。”--https://enable-cors.org/。
如果要了解更多关于Middleware
的知识,请参考Middleware章节。
图片作者: Wikipedia
Basic
首先将CORS
的middleware添加到Droplet中:
# Insert CORS before any other middlewares
drop.middleware.insert(CORSMiddleware(), at: 0)
注意:确保在任何其他
middleware
之前插入CORSmiddleware
,如AbortMiddleware
或类似的。 否则,正确的header
可能不会添加到响应中。
CORSMiddleware
的默认配置能够满足多数用户使用,配置值如下:
- Allowed Origin
- 请求中原始header的值
- Allowed Method
-
GET
,POST
,PUT
,OPTIONS
,DELETE
,PATCH
- Allowed Headers
-
Accept
,Authorization
,Content-Type
,Origin
,X-Requested-With
Advanced
所有设置和预设可以由高级用户自定义。 有两种方式可以进行自定义设置:1,通过代码创建和配置CORSConfiguration
对象;2,将配置置于Vapor的JSON配置文件中。
有关如何设置这两个选项,请参见以下内容。
Configuration
CORSConfiguration
结构体是用来配置CORSMiddleware
的。下面是对其进行实例化:
let configuration = CORSConfiguration(allowedOrigin: .custom("https://vapor.codes"),
allowedMethods: [.get, .post, .options],
allowedHeaders: ["Accept", "Authorization"],
allowCredentials: false,
cacheExpiration: 600,
exposedHeaders: ["Cache-Control", "Content-Language"])
配置完成之后可以添加CORSMiddleware
了:
drop.middleware.insert(CORSMiddleware(configuration: configuration), at: 0)
注意:如果想了解更多可以配置的值,请查看
CORSConfiguration
的源码。
JSON Config
另外,CORSMiddleware
可以使用由Config
文件夹中包含的.json
文件进行配置。 你需要在项目的Config文件夹中创建一个名为cors.json
或CORS.json
的文件,并添加所需的键值(配置项)。
示例:
{
"allowedOrigin": "origin",
"allowedMethods": "GET,POST,PUT,OPTIONS,DELETE,PATCH",
"allowedHeaders": ["Accept", "Authorization", "Content-Type", "Origin", "X-Requested-With"]
}
注意:
allowedOrigin
,allowedMethods
,allowedHeaders
是必须配置的。 如果不存在,则会在实例化middleware时抛出异常。
另外,allowCredentials
(Bool),cacheExpiration
(Int)和exposedHeaders
([String])是可选的配置。
然后可以通过接收Config
的初始化方法重载配置信息,并将middleware添加到Droplet中。
let drop = Droplet()
do {
drop.middleware.insert(try CORSMiddleware(configuration: drop.config), at: 0)
} catch {
fatalError("Error creating CORSMiddleware, please check that you've setup cors.json correctly.")
}