编辑此页面

跨域资源共享 (CORS)

在 Quarkus 中启用并配置 CORS 以指定允许的来源、方法和标头,指导浏览器安全地处理跨域请求。

跨域资源共享 (CORS) 使用 HTTP 标头安全地管理浏览器对来自外部来源的资源的请求。 通过指定允许的来源、方法和标头,Quarkus 服务器可以使用 CORS 过滤器来允许浏览器跨域请求资源,同时保持受控访问。 此机制增强了安全性并支持合法的跨域请求。 有关来源定义的更多信息,请参见Web Origin Concept

启用 CORS 过滤器

要在您的应用程序中强制执行 CORS 策略,请将以下行添加到 `src/main/resources/application.properties` 文件中,以启用 Quarkus CORS 过滤器

quarkus.http.cors.enabled=true

该过滤器拦截所有传入的 HTTP 请求,以识别跨域请求并应用配置的策略。 然后,该过滤器将 CORS 标头添加到 HTTP 响应,以通知浏览器有关允许的来源和访问参数。 对于预检请求,该过滤器会立即返回 HTTP 响应。 对于常规 CORS 请求,如果请求违反配置的策略,该过滤器会返回 HTTP 403 状态来拒绝访问;否则,如果策略允许,该过滤器会将请求转发到目标。

有关详细的配置选项,请参阅以下配置属性部分。

构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖

配置属性

类型

默认

CORS 允许的来源。

有效的 URL 的逗号分隔列表,例如 `http://www.quarkus.io,https://:3000`。 用正斜杠括起来的 URL 被解释为正则表达式。

环境变量: QUARKUS_HTTP_CORS_ORIGINS

显示更多

字符串列表

CORS 请求允许的 HTTP 方法。

有效的 HTTP 方法的逗号分隔列表,例如 `GET,PUT,POST`。 如果未设置,则过滤器默认允许任何 HTTP 方法。

默认值: 允许任何 HTTP 请求方法。

环境变量: QUARKUS_HTTP_CORS_METHODS

显示更多

字符串列表

CORS 请求允许的 HTTP 标头。

有效的标头的逗号分隔列表,例如 `X-Custom,Content-Disposition`。 如果未设置,则过滤器默认允许任何标头。

默认值: 允许任何 HTTP 请求标头。

环境变量: QUARKUS_HTTP_CORS_HEADERS

显示更多

字符串列表

CORS 响应中公开的 HTTP 标头。

要公开的标头的逗号分隔列表,例如 `X-Custom,Content-Disposition`。

默认值: 不公开任何标头。

环境变量: QUARKUS_HTTP_CORS_EXPOSED_HEADERS

显示更多

字符串列表

Access-Control-Max-Age 响应标头值,采用 `java.time.Duration` 格式。

通知浏览器它可以缓存预检请求结果的时间。

环境变量: QUARKUS_HTTP_CORS_ACCESS_CONTROL_MAX_AGE

显示更多

Duration 

Access-Control-Allow-Credentials 响应标头。

告知浏览器,当请求的凭据模式 `Request.credentials` 设置为 `include` 时,是否允许前端 JavaScript 访问凭据。

默认值: 如果设置了 `quarkus.http.cors.origins` 属性并且与精确的 `Origin` 标头值匹配,则为 `true`。

环境变量: QUARKUS_HTTP_CORS_ACCESS_CONTROL_ALLOW_CREDENTIALS

显示更多

布尔值

关于 Duration 格式

要编写持续时间值,请使用标准的 `java.time.Duration` 格式。 有关更多信息,请参阅 Duration#parse() Java API 文档

您还可以使用简化的格式,以数字开头

  • 如果该值仅为一个数字,则表示以秒为单位的时间。

  • 如果该值是一个数字后跟 ms,则表示以毫秒为单位的时间。

在其他情况下,简化格式将被转换为 java.time.Duration 格式以进行解析

  • 如果该值是一个数字后跟 hms,则在其前面加上 PT

  • 如果该值是一个数字后跟 d,则在其前面加上 P

CORS 配置示例

以下示例显示了完整的 CORS 过滤器配置,包括用于定义来源之一的正则表达式。

quarkus.http.cors.enabled=true (1)
quarkus.http.cors.origins=http://example.com,http://www.example.io,/https://([a-z0-9\\-_]+)\\\\.app\\\\.mydomain\\\\.com/ (2)
quarkus.http.cors.methods=GET,PUT,POST (3)
quarkus.http.cors.headers=X-Custom (4)
quarkus.http.cors.exposed-headers=Content-Disposition (5)
quarkus.http.cors.access-control-max-age=24H (6)
quarkus.http.cors.access-control-allow-credentials=true (7)
1 启用 CORS 过滤器。
2 指定允许的来源,包括正则表达式。
3 列出跨域请求允许的 HTTP 方法。
4 声明客户端可以在请求中包含的自定义标头。
5 标识客户端可以访问的响应标头。
6 设置预检请求结果的缓存时长。
7 允许跨域请求中的 cookie 或凭据。

在 `application.properties` 文件中使用正则表达式时,请使用四个反斜杠 (``\\\\``) 转义特殊字符,以确保正确的行为。 例如

  • `\\\\.` 匹配文字 `.` 字符。

  • `\.` 将匹配任何单个字符作为正则表达式元数据字符。

不正确转义的模式可能会导致意外的行为或安全漏洞。 部署前始终验证正则表达式语法。

在开发模式下允许所有来源

在开发期间配置来源可能具有挑战性。 为了简化开发,请考虑仅在开发模式下允许所有来源

quarkus.http.cors.enabled=true
%dev.quarkus.http.cors.origins=/.*/

仅在开发配置文件 (`%dev`) 中允许所有来源。 在生产环境中允许不受限制的来源会带来严重的安全风险,例如未经授权的数据访问或资源滥用。 对于生产环境,请在 `quarkus.http.cors.origins` 属性中定义显式来源。

相关内容