HTTP 参考
本文档阐明了 Quarkus 中可用的不同 HTTP 功能。
Eclipse Vert.x 提供了基本的 HTTP 层。对于 Servlet 支持,Quarkus 采用定制的 Undertow 版本,该版本在 Vert.x 之上运行,而 Jakarta REST 支持则通过 RESTEasy 提供。
当 Undertow 存在时,RESTEasy 作为 Servlet 过滤器运行。如果 Undertow 不存在,RESTEasy 将直接在 Vert.x 上运行,而不涉及 Servlet。
1. 提供静态资源
如果您希望使用 Quarkus 构建 Web 应用程序,请参阅 Quarkus for the Web 指南。
1.1. 从应用程序 jar
要从应用程序 jar 提供静态资源,您必须将它们放置在应用程序的 META-INF/resources
目录中。选择此位置是因为它是 Servlet 规范定义的 jar
文件中资源的标准位置。即使 Quarkus 可以在没有 Servlet 的情况下使用,遵循此约定也能使将资源放置在此位置的现有代码正常运行。
1.2. 从 Web 依赖项(如 webjars 或 mvnpm)
请参阅 Web 依赖项定位器 指南,了解有关如何使用 WebJars、mvnpm 和 importmaps 的详细信息。
1.3. 从本地目录
可以通过在 Vert.x 路由器中安装额外的路由来从本地目录提供静态资源。
例如,要从相对于当前路径的 static/
目录在 https://:8080/static/ 上提供资源,您可以安装以下路由
package org.acme;
import io.quarkus.runtime.StartupEvent;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.StaticHandler;
import jakarta.enterprise.event.Observes;
public class StaticResources {
void installRoute(@Observes StartupEvent startupEvent, Router router) {
router.route()
.path("/static/*")
.handler(StaticHandler.create("static/"));
}
}
1.4. HTTP 压缩
默认情况下,静态资源的响应正文不会被压缩。您可以通过 quarkus.http.enable-compression=true
来启用 HTTP 压缩支持。如果启用了压缩支持,则如果从资源的文件名派生的 Content-Type
标头是压缩媒体类型(通过 quarkus.http.compress-media-types
配置),则响应正文将被压缩。
默认情况下,以下媒体类型列表会被压缩:text/html 、text/plain 、text/xml 、text/css 、text/javascript 、application/javascript 、application/json 、application/graphql+json 和 application/xhtml+xml 。 |
如果客户端未在请求标头中指示其对 HTTP 压缩的支持,例如 Accept-Encoding: deflate, gzip, br ,则响应正文不会被压缩。 |
默认情况下,Brotli 压缩不可用。您可以通过设置 quarkus.http.compressors=deflate,gzip,br 来启用它。在构建本机镜像的情况下,它会为您的可执行文件增加约 1MB 的大小。 |
1.5. 其他配置
此外,静态资源的索引页面可以从默认的 index.html
更改,隐藏文件(例如点文件)可以指示为不提供服务,范围请求可以禁用,并且可以配置缓存支持(例如缓存标头和文件属性缓存)。
构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖
配置属性 |
类型 |
默认 |
---|---|---|
设置提供静态资源时的索引页面。 环境变量: 显示更多 |
字符串 |
|
设置是否应提供隐藏文件。 环境变量: 显示更多 |
布尔值 |
|
设置是否应启用范围请求(可恢复下载;媒体流)。 环境变量: 显示更多 |
布尔值 |
|
设置是否启用缓存处理。 环境变量: 显示更多 |
布尔值 |
|
设置缓存条目超时时间。默认值为 环境变量: 显示更多 |
|
|
设置缓存标头中最大期限的值。默认值为 环境变量: 显示更多 |
|
|
设置最大缓存大小。 环境变量: 显示更多 |
整数 |
|
文本相关文件的内容编码 环境变量: 显示更多 |
|
关于 Duration 格式
要编写持续时间值,请使用标准 您还可以使用简化的格式,以数字开头
在其他情况下,简化格式将被转换为
|
2. 配置上下文路径
默认情况下,Quarkus 将从根上下文下提供内容。 如果您想更改此设置,可以使用 quarkus.http.root-path
配置键来设置上下文路径。
如果您正在使用 Servlet,则可以通过 quarkus.servlet.context-path
控制 Servlet 上下文路径。 此项是相对于上面的 http 根目录的,并且仅影响 Servlet 和在 Servlet 之上运行的内容。 大多数应用程序将希望使用 HTTP 根目录,因为它会影响 Quarkus 提供的所有内容。
如果两者都指定,则所有非 Servlet Web 端点都将相对于 quarkus.http.root-path
,而 Servlet 将相对于 {quarkus.http.root-path}/{quarkus.servlet.context-path}
提供服务。
如果 REST Assured 用于测试并且设置了 quarkus.http.root-path
,则 Quarkus 将自动配置基本 URL 以在 Quarkus 测试中使用,因此测试 URL 不应包含根路径。
通常,Web 内容的路径配置是相对于 quarkus.http.root-path
(默认为 /)解释的。
-
要在该上下文根目录中指定路径,请使用不以正斜杠开头的相对路径。
-
如果您要显式指定 URI,使其始终与
quarkus.http.root-path
的值无关,请使用以正斜杠开头的绝对路径。
例如,如果扩展程序配置了 service
路径,则该端点将从 ${quarkus.http.root-path}/service
提供服务。 如果您将该路径的配置更改为 /service
,则该端点将从 /service
提供服务。
Quarkus 中的路径解析 博客文章进一步解释了用户和扩展程序定义的路径的路径解析如何工作。
管理界面
有关更多信息,请参阅管理界面参考。 |
3. 支持使用 TLS/SSL 的安全连接
要使 Quarkus 支持安全连接,您必须提供证书和关联的密钥文件,或提供密钥库。
在这两种情况下,都必须提供密码。 有关如何提供的详细说明,请参见指定段落。
要启用对本机可执行文件的 TLS/SSL 支持,请参阅我们的 使用 SSL 与本机可执行文件指南。 |
3.1. 使用 TLS 集中配置
Quarkus 提供了 TLS 集中配置,可用于配置服务器的 TLS 上下文。 这是配置 HTTPS 的建议方法。
要配置 HTTP 服务器以使用 HTTPS,可以使用以下配置
quarkus.tls.key-store.pem.0.cert=server.crt
quarkus.tls.key-store.pem.0.key=server.key
quarkus.http.insecure-requests=disabled # Reject HTTP requests
要使用 p12
(PKCS12) 密钥库,请应用以下配置
quarkus.tls.key-store.p12.path=server-keystore.p12
quarkus.tls.key-store.p12.password=secret
quarkus.http.insecure-requests=disabled # Reject HTTP requests
除了默认配置之外,您还可以使用命名配置
quarkus.tls.https.key-store.p12.path=server-keystore.p12
quarkus.tls.https.key-store.p12.password=secret
quarkus.http.insecure-requests=disabled
quarkus.http.tls-configuration-name=https
3.2. 直接配置 HTTP 服务器
如果您不想使用 TLS 注册表,则可以直接配置 HTTP 服务器。
如果证书尚未加载到密钥库中,则可以使用下面列出的属性直接提供证书。 Quarkus 将首先尝试将给定的文件作为资源加载,并使用文件系统作为后备。 证书/密钥对将在启动时加载到新创建的密钥库中。
您的 application.properties
将如下所示
quarkus.http.ssl.certificate.files=/path/to/certificate
quarkus.http.ssl.certificate.key-files=/path/to/key
另一种解决方案是直接提供密钥库,该密钥库已经包含带有证书的默认条目。 您至少需要提供文件和密码。
与证书/密钥文件组合一样,Quarkus 将首先尝试将给定的路径解析为资源,然后再尝试从文件系统中读取它。
将以下属性添加到您的 application.properties
quarkus.http.ssl.certificate.key-store-file=/path/to/keystore
作为可选提示,密钥库的类型可以作为列出的选项之一提供。 如果未提供类型,Quarkus 将尝试从文件扩展名中推断出该类型。
quarkus.http.ssl.certificate.key-store-file-type=[one of JKS, JCEKS, P12, PKCS12, PFX]
在上述两种情况下,都需要提供密码才能创建/加载带有密码的密钥库。 可以在您的 application.properties
中(以纯文本形式)使用以下属性设置密码
quarkus.http.ssl.certificate.key-store-password=your-password
但是,与其在配置文件中以纯文本形式提供密码(这被认为是错误的实践),不如将其(使用 MicroProfile Config)作为环境变量 QUARKUS_HTTP_SSL_CERTIFICATE_KEY_STORE_PASSWORD
提供。 这也将与 Kubernetes 密钥 协同工作。
注意:为了与 Quarkus 的早期版本(0.16 之前)保持兼容性,默认密码设置为“password”。 因此,它不是强制性参数!
3.3. 配置 HTTPS 端口
默认情况下,Quarkus 侦听端口 8443 以进行 SSL 安全连接,并在运行测试时侦听端口 8444。
这些端口可以在您的 application.properties
中使用属性 quarkus.http.ssl-port
和 quarkus.http.test-ssl-port
进行配置。
3.4. 禁用 HTTP 端口
可以禁用 HTTP 端口并仅支持安全请求。 这是通过 application.properties
中的 quarkus.http.insecure-requests
属性完成的。 有三个可能的值
enabled
-
默认值,HTTP 正常工作
redirect
-
HTTP 请求将被重定向到 HTTPS 端口
disabled
-
HTTP 端口将不会打开。
如果您使用 redirect 或 disabled 并且尚未添加 SSL 证书或密钥库,则您的服务器将不会启动! |
3.5. 重新加载证书
密钥库、信任库和证书文件可以定期重新加载。 配置 quarkus.http.ssl.certificate.reload-period
属性以指定应重新加载证书的间隔
quarkus.http.ssl.certificate.files=/mount/certs/tls.crt
quarkus.http.ssl.certificate.key-files=/mount/certs/tls.key
quarkus.http.ssl.certificate.reload-period=1h
这些文件从最初加载的同一位置重新加载。 如果没有内容更改,则重新加载是空操作。 如果重新加载失败,服务器将继续使用先前的证书。
3.6. 防止客户端重新协商
有关更多信息,请参阅 防止客户端重新协商。
4. 额外的 HTTP 标头
要启用在每个响应上发送 HTTP 标头,请添加以下属性
quarkus.http.header."X-Content-Type-Options".value=nosniff
这将在应用程序中对任何资源执行的请求的响应中包含 X-Content-Type-Options: nosniff
HTTP 标头。
您还可以指定一个 path
模式和需要应用标头的 HTTP methods
quarkus.http.header.Pragma.value=no-cache
quarkus.http.header.Pragma.path=/headers/pragma
quarkus.http.header.Pragma.methods=GET,HEAD
仅当使用 GET
或 HEAD
方法调用 /headers/pragma
资源时,才会应用 Pragma
标头
构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖
配置属性 |
类型 |
默认 |
---|---|---|
字符串 |
|
|
字符串 |
必需 |
|
此标头配置的 HTTP 方法。 如果未指定 HTTP 方法,则将始终添加标头。 环境变量: 显示更多 |
字符串列表 |
4.1. 每个路径的额外 HTTP 标头
如果需要根据路径设置不同的标头值,可以使用以下配置
quarkus.http.filter.index.header."Cache-Control"=none
quarkus.http.filter.index.matches=/index.html
当调用 /index.html
时,这将 Cache-Control
标头设置为 none
。
键中 quarkus.http.filter 之后的 index 用于分组,并且(例如)可以随意命名。 |
您可以在路径中使用正则表达式,也可以指定将设置 HTTP 标头的 HTTP 方法
quarkus.http.filter.static.header."Cache-Control"=max-age=31536000
quarkus.http.filter.static.methods=GET,HEAD
quarkus.http.filter.static.matches=/static/.*
如果配置中存在重叠路径,则可以指定一个顺序(值越高,优先级越高)。 例如,具有以下配置
quarkus.http.filter.just-order.order=10
quarkus.http.filter.just-order.header."Cache-Control"=max-age=5000
quarkus.http.filter.just-order.matches=/paths/order
quarkus.http.filter.any-order.order=11
quarkus.http.filter.any-order.header."Cache-Control"=max-age=1
quarkus.http.filter.any-order.matches=/paths/order.*
在请求 /paths/order
时将包含 Cache-Control: max-age=1
标头。
构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖
配置属性 |
类型 |
默认 |
---|---|---|
字符串 |
必需 |
|
始终在响应中发送的其他 HTTP 标头 环境变量: 显示更多 |
Map<String,String> |
|
字符串列表 |
||
应用此路径配置的顺序。 优先级越高,优先级越高 环境变量: 显示更多 |
整数 |
5. 在 vert.x 中支持 100-Continue
要支持 100-continue
,需要显式启用 quarkus.http.handle-100-continue-automatically
选项。 有关更多信息,请查看 100-continue 和相关的 Vert.x 文档。
quarkus.http.handle-100-continue-automatically=true
6. HTTP/2 支持
默认情况下启用 HTTP/2,如果使用 SSL,则浏览器将使用它。 即使未使用 SSL,也支持通过明文升级的 HTTP/2,并且非浏览器客户端可以使用它。
如果要禁用 HTTP/2,可以设置
quarkus.http.http2=false
请注意,某些配置属性特定于 HTTP/2。 例如,要配置最大标头列表大小(~ 标头),您需要配置 quarkus.http.limits.max-header-list-size
属性。 您还可以使用 quarkus.http.http2-push-enabled
启用或禁用 HTTP/2 推送。
7. 侦听随机端口
如果您不想指定端口,可以设置 quarkus.http.port=0
或 quarkus.http.test-port=0
。 操作系统将选择一个随机的开放端口,并在控制台中打印一条日志消息。 当端口绑定后,quarkus.http.port
系统属性将设置为所选的实际端口,因此您可以使用它从应用程序内部获取实际端口号。 如果您正在进行测试,您可以正常注入 URL,这将使用实际端口进行配置,并且 REST Assured 也将进行相应的配置。
由于这将设置一个系统属性,因此您可以通过 MicroProfile Config 访问 quarkus.http.port ,但是,如果使用注入,则注入的值可能并不总是正确的。 此端口分配是 Quarkus 启动中发生的最后一件事之一,因此,如果在端口打开之前过早创建了要注入的对象,则注入的值将不正确。 |
8. CORS 过滤器
要使您的 Quarkus 应用程序可从在不同域上运行的另一个应用程序访问,您需要配置跨域资源共享 (CORS)。 有关 Quarkus 提供的 CORS 过滤器的更多信息,请参阅 "跨域资源共享" 指南的 Quarkus CORS 过滤器 部分。
9. HTTP 限制配置
构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖
配置属性 |
类型 |
默认 |
---|---|---|
所有标头的最大长度,最多 环境变量: 显示更多 |
|
|
请求正文的最大大小,最多 环境变量: 显示更多 |
|
|
最大 HTTP 块大小,最多 环境变量: 显示更多 |
|
|
初始行的最大长度(例如 环境变量: 显示更多 |
整数 |
|
表单属性的最大长度,最多 环境变量: 显示更多 |
|
|
设置表单的最大字段数。 设置为 环境变量: 显示更多 |
整数 |
|
设置服务器在解码表单时可以缓冲的最大字节数。 设置为 环境变量: 显示更多 |
|
|
允许传入请求的最大 HTTP 请求参数数。 如果客户端在请求中发送的参数超过此数量,则连接将关闭。 环境变量: 显示更多 |
整数 |
|
一次允许的最大连接数。 如果设置了此值,建议设置一个短的空闲超时时间。 环境变量: 显示更多 |
整数 |
|
设置 SETTINGS_HEADER_TABLE_SIZE HTTP/2 设置。 允许发送方通知远程端点用于解码标头块的标头压缩表的最大大小(以八位字节为单位)。 编码器可以通过使用标头块内的标头压缩格式特定的信令来选择等于或小于此值的任何大小。 初始值为 环境变量: 显示更多 |
long |
|
设置 SETTINGS_MAX_CONCURRENT_STREAMS HTTP/2 设置。 指示发送方将允许的最大并发流数。 此限制是定向的:它适用于发送方允许接收方创建的流数。 最初,此值没有限制。 建议此值不小于 100,以避免不必要地限制并行性。 环境变量: 显示更多 |
long |
|
设置 SETTINGS_MAX_FRAME_SIZE HTTP/2 设置。 指示发送方愿意接收的最大帧有效负载的大小(以八位字节为单位)。 初始值为 环境变量: 显示更多 |
整数 |
|
设置 SETTINGS_MAX_HEADER_LIST_SIZE HTTP/2 设置。 此建议设置通知对等方发送方准备接受的最大标头列表大小(以八位字节为单位)。 该值基于标头字段的未压缩大小,包括名称和值的长度(以八位字节为单位)以及每个标头字段 32 个八位字节的开销。 默认值为 环境变量: 显示更多 |
long |
|
设置每个时间窗口允许的最大 RST 帧数,这用于防止 HTTP/2 RST 帧洪水 DDOS 攻击。 默认值为 环境变量: 显示更多 |
整数 |
|
设置在检查最大 RST 帧数时的时间窗口的持续时间,这用于防止 HTTP/2 RST 帧洪水 DDOS 攻击。 默认值为 环境变量: 显示更多 |
关于 Duration 格式
要编写持续时间值,请使用标准 您还可以使用简化的格式,以数字开头
在其他情况下,简化格式将被转换为
|
关于 MemorySize 格式
大小配置选项识别以下格式的字符串(显示为正则表达式): 如果未给出后缀,则假定为字节。 |
10. 配置流量整形
流量整形允许您限制所有通道(即连接)上的带宽,而不管打开的通道数如何。 当您要控制总体网络流量以防止拥塞或确定某些类型的流量的优先级时,这可能很有用。
要启用流量整形,请在您的应用程序配置中添加以下属性
quarkus.http.traffic-shaping.enabled=true # Required to enable traffic shaping
流量整形允许您配置各种参数,例如写入和读取限制(以字节/秒为单位)、检查间隔(两次带宽计算之间的延迟)和最大等待时间
quarkus.http.traffic-shaping.enabled=true # Required to enable traffic shaping
quarkus.http.traffic-shaping.check-interval=30s
quarkus.http.traffic-shaping.outbound-global-bandwidth=1M
quarkus.http.traffic-shaping.inbound-global-bandwidth=1M
quarkus.http.traffic-shaping.max-delay=10s
检查间隔表示计算流量的周期,并且较高的间隔可能导致不太精确的流量整形。 尽管接受 0(无统计),但建议为检查间隔设置一个正值,即使它很高,因为流量整形的精度取决于计算流量的周期。 在这种情况下,建议值是接近 5 或 10 分钟的值。
outbound-global-bandwidth
和 inbound-global-bandwidth
参数分别表示写入和读取操作每秒的最大字节数。 您还应考虑使读取或写入操作中的对象大小相对适应您需要的带宽。 例如,对于 10KB/s 具有 10 MB 对象将导致突发效应,而对于 1 MB/s 具有 100 KB 对象应该由流量整形平稳处理。
此外,您可以设置最大等待时间 (max-delay
),该时间指定时间整形的上限。 默认情况下,它设置为 15 秒。 它必须小于 HTTP 超时时间。 当达到其中一个阈值时,在该时间段内不会发生任何写入。
11. 配置 HTTP 访问日志
您可以通过在 application.properties
中配置 HTTP 请求日志记录来添加 HTTP 请求日志记录。 日志记录有两个选项,要么记录到标准 JBoss 日志输出,要么记录到专用文件。
构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖
配置属性 |
类型 |
默认 |
---|---|---|
如果启用了访问日志记录。默认情况下,这将通过标准日志记录工具进行记录 环境变量: 显示更多 |
布尔值 |
|
一个正则表达式,可用于从日志记录中排除某些路径。 环境变量: 显示更多 |
字符串 |
|
访问日志模式。 如果这是字符串
否则,请查阅 Quarkus 文档,获取可使用的完整变量列表。 环境变量: 显示更多 |
字符串 |
|
布尔值 |
|
|
访问日志文件基本名称,默认为 'quarkus',这将给出日志文件名 'quarkus.log'。 环境变量: 显示更多 |
字符串 |
|
将访问记录到文件时使用的日志目录 如果未设置,则使用当前工作目录。 环境变量: 显示更多 |
字符串 |
|
字符串 |
|
|
如果通过标准日志机制进行日志记录(即,如果 base-file-name 为空),则使用的日志类别。 环境变量: 显示更多 |
字符串 |
|
布尔值 |
|
|
是否应将重新路由的请求合并到一个日志条目中 环境变量: 显示更多 |
布尔值 |
|
属性 | 短格式 | 长格式 |
---|---|---|
远程 IP 地址 |
|
|
本地 IP 地址 |
|
|
发送的字节数,不包括 HTTP 标头,如果未发送字节,则为 '-' |
|
|
发送的字节数,不包括 HTTP 标头 |
|
|
远程主机名 |
|
|
请求协议 |
|
|
请求方法 |
|
|
本地端口 |
|
|
查询字符串(如果存在,则在前面加上 '?',否则为空字符串) |
|
|
请求的第一行 |
|
|
响应的 HTTP 状态代码 |
|
|
日期和时间,以通用日志格式 |
|
|
由符合 DateTimeFormatter 的字符串定义的日期和时间 |
|
|
已通过身份验证的远程用户 |
|
|
请求的 URL 路径 |
|
|
请求相对路径 |
|
|
本地服务器名称 |
|
|
处理请求所花费的时间(毫秒) |
|
|
处理请求所花费的时间(秒) |
|
|
处理请求所花费的时间(微秒) |
|
|
处理请求所花费的时间(纳秒) |
|
|
当前请求线程名称 |
|
|
SSL 密码 |
|
|
SSL 客户端证书 |
|
|
SSL 会话 ID |
|
|
所有请求标头 |
|
|
Cookie 值 |
|
|
查询参数 |
|
|
请求标头 |
|
|
响应标头 |
|
|
Vert.x 路由上下文内部数据 |
|
|
Vert.x MDC 数据(例如,OpenTelemetry 的 'traceId') |
|
设置 quarkus.http.access-log.consolidate-rerouted-requests=true
以启用对修饰符 <
的支持。此修饰符可用于已在内部重定向的请求,以查阅原始请求。以下属性支持此修饰符
属性 | 短格式 | 长格式 |
---|---|---|
请求的第一行 |
|
|
请求方法 |
|
|
请求相对路径 |
|
|
请求的 URL 路径 |
|
|
查询字符串(如果存在,则在前面加上 '?',否则为空字符串) |
|
|
查询参数 |
|
设置 |
假设已为应用程序设置安全性(有关更多详细信息,请参阅我们的 指南),则日志记录属性 |
使用 |
12. 任意自定义
Quarkus 允许用户通过使用 io.quarkus.vertx.http.HttpServerOptionsCustomizer
来任意自定义 Quarkus 启动的 HTTP 服务器的选项。例如,如果需要以编程方式设置 HTTP 端口,则可以使用以下代码
import jakarta.inject.Singleton;
import io.quarkus.vertx.http.HttpServerOptionsCustomizer;
@Singleton (1)
public class MyCustomizer implements HttpServerOptionsCustomizer {
@Override
public void customizeHttpServer(HttpServerOptions options) { (2)
options.setPort(9998);
}
}
1 | 通过将类设为托管 bean,Quarkus 在启动 Vert.x 服务器时将考虑定制器 |
2 | 在这种情况下,我们只关心自定义 HTTP 服务器,因此我们只覆盖 customizeHttpServer 方法,但用户应该知道 HttpServerOptionsCustomizer 也允许配置 HTTPS 和域套接字服务器 |
13. 如何在 HTTP 服务器启动时执行逻辑
为了在 HTTP 服务器启动时执行一些自定义操作,您需要声明一个异步 CDI 观察器方法。当相应的 HTTP 服务器开始侦听配置的主机和端口时,Quarkus 异步 触发类型为 io.quarkus.vertx.http.HttpServerStart
、io.quarkus.vertx.http.HttpsServerStart
和 io.quarkus.vertx.http.DomainSocketServerStart
的 CDI 事件。
HttpServerStart
示例@ApplicationScoped
public class MyListener {
void httpStarted(@ObservesAsync HttpServerStart start) { (1)
// ...notified when the HTTP server starts listening
}
}
1 | 可以通过使用 @jakarta.enterprise.event.ObservesAsync 注释 HttpServerStart 参数来声明异步 HttpServerStart 观察器方法。 |
无法将 StartupEvent 用于此特定用例,因为此 CDI 事件是在 HTTP 服务器启动之前触发的。 |
14. 在反向代理后面运行
Quarkus 可以通过代理访问,这些代理还会生成标头(例如 X-Forwarded-Host
),以保留来自代理服务器面向客户端侧的信息,这些信息在涉及时会被更改或丢失。在这些情况下,可以将 Quarkus 配置为自动更新协议、主机、端口和 URI 等信息,以反映这些标头中的值。
激活此功能会使服务器暴露于多个安全问题(即,信息欺骗)。仅在反向代理后面运行时才考虑激活它。 |
要设置此功能,请在 src/main/resources/application.properties
中包含以下行
quarkus.http.proxy.proxy-address-forwarding=true
要仅考虑事实上的标准标头(Forwarded
标头),请在 src/main/resources/application.properties
中包含以下行
quarkus.http.proxy.allow-forwarded=true
要仅考虑非标准标头,请改为在 src/main/resources/application.properties
中包含以下行
quarkus.http.proxy.proxy-address-forwarding=true
quarkus.http.proxy.allow-x-forwarded=true
quarkus.http.proxy.enable-forwarded-host=true
quarkus.http.proxy.enable-forwarded-prefix=true
quarkus.http.proxy.trusted-proxies=127.0.0.1 (1)
1 | 使用 IP 地址 127.0.0.1 配置受信任的代理。来自任何其他地址的请求标头将被忽略。 |
与标准和非标准标头相关的两个配置可以组合,尽管标准标头配置将优先。但是,组合它们具有安全隐患,因为客户端可以使用未被代理覆盖的转发标头伪造请求。因此,代理应从客户端剥离意外的 Forwarded
或 X-Forwarded-*
标头。
支持的转发地址标头为
-
Forwarded
-
X-Forwarded-Proto
-
X-Forwarded-Host
-
X-Forwarded-Port
-
X-Forwarded-Ssl
-
X-Forwarded-Prefix
15. SameSite Cookie
通过列出 cookie 名称和 SameSite
属性,可以轻松地将 SameSite cookie 属性添加到由 Quarkus 端点设置的任何 cookie,例如
quarkus.http.same-site-cookie.jwt.value=Lax
quarkus.http.same-site-cookie.session.value=Strict
给定此配置,jwt
cookie 将具有 SameSite=Lax
属性,而 session
cookie 将具有 SameSite=Strict
属性。
16. Servlet 配置
要使用 Servlet,您需要显式包含 quarkus-undertow
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-undertow</artifactId>
</dependency>
implementation("io.quarkus:quarkus-undertow")
16.1. undertow-handlers.conf
您可以使用 undertow-handlers.conf
文件来使用 Undertow 谓词语言。此文件应放置在应用程序 jar 的 META-INF
目录中。此文件包含使用 Undertow 谓词语言 定义的处理程序。
16.3. 内置路由顺序值
路由顺序值是通过 Vert.x 路由 io.vertx.ext.web.Route.order(int)
函数指定的值。
Quarkus 注册了几个具有特定顺序值的路由。这些常量在 io.quarkus.vertx.http.runtime.RouteConstants
类中定义,并在下表中列出。自定义路由应定义 20000 或更高的顺序值,以便它不会干扰 Quarkus 和扩展提供的功能。
在 io.quarkus.vertx.http.runtime.RouteConstants
和已知扩展中定义的路由顺序常量
路由顺序值 |
常量名称 |
来源 |
|
|
访问日志处理程序,如果在配置中启用。 |
|
|
添加开始时间的处理程序,如果在配置中启用。 |
|
|
-替换正文处理程序。 |
|
|
管理路由器的正文处理程序。 |
|
|
添加配置中指定的标头的处理程序。 |
|
|
管理路由器的 CORS-Origin 处理程序。 |
|
|
正文处理程序。 |
|
|
强制执行上传正文大小限制的路由。 |
|
|
压缩处理程序。 |
|
|
优先级高于默认路由的路由(从此值添加偏移量)。 |
|
|
默认路由顺序(即,静态资源、Servlet)。 |
|
|
没有高于默认路由优先级的路由(从此值添加偏移量) |