此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.1.10Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.1.10Spring中文文档

该模块包含以下对响应式 Web 的基础支持 应用:spring-webSpring中文文档

HttpHandler

HttpHandler 是一个简单的协定,具有处理请求和响应的单一方法。是的 有意最小化,其主要和唯一目的是成为最小抽象 在不同的 HTTP 服务器 API 上。Spring中文文档

下表描述了支持的服务器 API:Spring中文文档

服务器名称 使用的服务器 API 响应式流支持

内蒂Spring中文文档

Netty APISpring中文文档

Reactor Netty(内蒂反应堆)Spring中文文档

退波Spring中文文档

Undertow APISpring中文文档

spring-web:Undertow 到 Reactive Streams 桥接Spring中文文档

雄猫Spring中文文档

Servlet 非阻塞 I/O;Tomcat API 读取和写入 ByteBuffers 与 byte[]Spring中文文档

spring-web:Servlet 非阻塞 I/O 到反应式流的桥接Spring中文文档

码头Spring中文文档

Servlet 非阻塞 I/O;Jetty API 用于编写 ByteBuffers 与 byte[]Spring中文文档

spring-web:Servlet 非阻塞 I/O 到反应式流的桥接Spring中文文档

Servlet 容器Spring中文文档

Servlet 非阻塞 I/OSpring中文文档

spring-web:Servlet 非阻塞 I/O 到反应式流的桥接Spring中文文档

下表描述了服务器依赖关系(另请参阅支持的版本):Spring中文文档

服务器名称 组 ID 项目名称

Reactor Netty(内蒂反应堆)Spring中文文档

io.projectreactor.nettySpring中文文档

反应堆-nettySpring中文文档

退波Spring中文文档

io.undertowSpring中文文档

暗曳芯Spring中文文档

雄猫Spring中文文档

org.apache.tomcat.embedSpring中文文档

tomcat-embed-core(tomcat-embed-core)Spring中文文档

码头Spring中文文档

org.eclipse.jettySpring中文文档

jetty-server, jetty-servletSpring中文文档

下面的代码片段显示了将适配器与每个服务器 API 配合使用:HttpHandlerSpring中文文档

Reactor Netty(内蒂反应堆)Spring中文文档

HttpHandler handler = ...
ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(handler);
HttpServer.create().host(host).port(port).handle(adapter).bindNow();
val handler: HttpHandler = ...
val adapter = ReactorHttpHandlerAdapter(handler)
HttpServer.create().host(host).port(port).handle(adapter).bindNow()
HttpHandler handler = ...
UndertowHttpHandlerAdapter adapter = new UndertowHttpHandlerAdapter(handler);
Undertow server = Undertow.builder().addHttpListener(port, host).setHandler(adapter).build();
server.start();
val handler: HttpHandler = ...
val adapter = UndertowHttpHandlerAdapter(handler)
val server = Undertow.builder().addHttpListener(port, host).setHandler(adapter).build()
server.start()
HttpHandler handler = ...
Servlet servlet = new TomcatHttpHandlerAdapter(handler);

Tomcat server = new Tomcat();
File base = new File(System.getProperty("java.io.tmpdir"));
Context rootContext = server.addContext("", base.getAbsolutePath());
Tomcat.addServlet(rootContext, "main", servlet);
rootContext.addServletMappingDecoded("/", "main");
server.setHost(host);
server.setPort(port);
server.start();
val handler: HttpHandler = ...
val servlet = TomcatHttpHandlerAdapter(handler)

val server = Tomcat()
val base = File(System.getProperty("java.io.tmpdir"))
val rootContext = server.addContext("", base.absolutePath)
Tomcat.addServlet(rootContext, "main", servlet)
rootContext.addServletMappingDecoded("/", "main")
server.host = host
server.setPort(port)
server.start()
HttpHandler handler = ...
Servlet servlet = new JettyHttpHandlerAdapter(handler);

Server server = new Server();
ServletContextHandler contextHandler = new ServletContextHandler(server, "");
contextHandler.addServlet(new ServletHolder(servlet), "/");
contextHandler.start();

ServerConnector connector = new ServerConnector(server);
connector.setHost(host);
connector.setPort(port);
server.addConnector(connector);
server.start();
val handler: HttpHandler = ...
val servlet = JettyHttpHandlerAdapter(handler)

val server = Server()
val contextHandler = ServletContextHandler(server, "")
contextHandler.addServlet(ServletHolder(servlet), "/")
contextHandler.start();

val connector = ServerConnector(server)
connector.host = host
connector.port = port
server.addConnector(connector)
server.start()

Servlet 容器Spring中文文档

要将 WAR 部署到任何 Servlet 容器,可以在 WAR 中扩展并包含 AbstractReactiveWebInitializer。该类包装 with 并寄存器 那作为一个.HttpHandlerServletHttpHandlerAdapterServletSpring中文文档

服务器名称 使用的服务器 API 响应式流支持

内蒂Spring中文文档

Netty APISpring中文文档

Reactor Netty(内蒂反应堆)Spring中文文档

退波Spring中文文档

Undertow APISpring中文文档

spring-web:Undertow 到 Reactive Streams 桥接Spring中文文档

雄猫Spring中文文档

Servlet 非阻塞 I/O;Tomcat API 读取和写入 ByteBuffers 与 byte[]Spring中文文档

spring-web:Servlet 非阻塞 I/O 到反应式流的桥接Spring中文文档

码头Spring中文文档

Servlet 非阻塞 I/O;Jetty API 用于编写 ByteBuffers 与 byte[]Spring中文文档

spring-web:Servlet 非阻塞 I/O 到反应式流的桥接Spring中文文档

Servlet 容器Spring中文文档

Servlet 非阻塞 I/OSpring中文文档

spring-web:Servlet 非阻塞 I/O 到反应式流的桥接Spring中文文档

服务器名称 组 ID 项目名称

Reactor Netty(内蒂反应堆)Spring中文文档

io.projectreactor.nettySpring中文文档

反应堆-nettySpring中文文档

退波Spring中文文档

io.undertowSpring中文文档

暗曳芯Spring中文文档

雄猫Spring中文文档

org.apache.tomcat.embedSpring中文文档

tomcat-embed-core(tomcat-embed-core)Spring中文文档

码头Spring中文文档

org.eclipse.jettySpring中文文档

jetty-server, jetty-servletSpring中文文档

WebHandler应用程序接口

该包基于 HttpHandler 协定构建 提供通用 Web API,用于通过多个 WebExceptionHandler、多个 WebFilter 和单个 WebHandler 组件的链处理请求。链条可以 只需指向自动检测组件的弹簧和/或注册组件即可组合在一起 与建设者。org.springframework.web.serverWebHttpHandlerBuilderApplicationContextSpring中文文档

虽然 API 的目标很简单,就是抽象出不同 HTTP 服务器的使用,但 API 旨在提供 Web 应用程序中常用的更广泛的功能集 如:HttpHandlerWebHandlerSpring中文文档

特殊豆类

下表列出了可以在 Spring ApplicationContext,或者可以直接向它注册:WebHttpHandlerBuilderSpring中文文档

Bean 名称 豆类 计数 描述

<任何>Spring中文文档

WebExceptionHandlerSpring中文文档

0..NSpring中文文档

提供对实例链和目标的异常的处理。有关详细信息,请参阅例外WebFilterWebHandlerSpring中文文档

<任何>Spring中文文档

WebFilterSpring中文文档

0..NSpring中文文档

将拦截样式逻辑应用于筛选器链的其余部分之前和之后,以及 目标 .有关详细信息,请参阅筛选器WebHandlerSpring中文文档

webHandlerSpring中文文档

WebHandlerSpring中文文档

1Spring中文文档

请求的处理程序。Spring中文文档

webSessionManagerSpring中文文档

WebSessionManagerSpring中文文档

0..1Spring中文文档

通过 上的方法公开的实例的管理器。 默认情况下。WebSessionServerWebExchangeDefaultWebSessionManagerSpring中文文档

serverCodecConfigurerSpring中文文档

ServerCodecConfigurerSpring中文文档

0..1Spring中文文档

用于访问用于解析表单数据和分段数据的实例,然后 通过 上的方法公开。 默认情况下。HttpMessageReaderServerWebExchangeServerCodecConfigurer.create()Spring中文文档

localeContextResolverSpring中文文档

LocaleContextResolverSpring中文文档

0..1Spring中文文档

通过 上的方法公开的解析器。 默认情况下。LocaleContextServerWebExchangeAcceptHeaderLocaleContextResolverSpring中文文档

forwardedHeaderTransformerSpring中文文档

ForwardedHeaderTransformerSpring中文文档

0..1Spring中文文档

用于处理转发类型标头,通过提取和删除它们或仅删除它们。 默认情况下不使用。Spring中文文档

表单数据

ServerWebExchange公开以下用于访问表单数据的方法:Spring中文文档

Mono<MultiValueMap<String, String>> getFormData();
suspend fun getFormData(): MultiValueMap<String, String>

使用 configured 来解析表单数据 () 转换为 .缺省情况下,配置为供 Bean 使用 (请参阅 Web 处理程序 API)。DefaultServerWebExchangeHttpMessageReaderapplication/x-www-form-urlencodedMultiValueMapFormHttpMessageReaderServerCodecConfigurerSpring中文文档

多部分数据

ServerWebExchange公开以下用于访问分段数据的方法:Spring中文文档

Mono<MultiValueMap<String, Part>> getMultipartData();
suspend fun getMultipartData(): MultiValueMap<String, Part>

使用 配置的 将 、 和 内容解析为 . 默认情况下,这是 ,它没有任何第三方 依赖。 或者,可以使用基于 Synchronoss NIO Multipart 库的 。 两者都是通过 Bean 配置的 (请参阅 Web 处理程序 API)。DefaultServerWebExchangeHttpMessageReader<MultiValueMap<String, Part>>multipart/form-datamultipart/mixedmultipart/relatedMultiValueMapDefaultPartHttpMessageReaderSynchronossPartHttpMessageReaderServerCodecConfigurerSpring中文文档

要以流式处理方式解析多部分数据,可以使用返回的 而不是使用 ,因为这意味着类似 的访问 按名称对单个部件进行分析,因此需要完整解析多部件数据。 相比之下,您可以使用将内容解码为 没有 收集到 .Flux<PartEvent>PartEventHttpMessageReader@RequestPartMap@RequestBodyFlux<PartEvent>MultiValueMapSpring中文文档

转发的标头

当请求通过代理(例如负载均衡器)时,主机、端口和 方案可能会改变。从客户的角度来看,这使得创建指向正确的链接成为一项挑战 主机、端口和方案。Spring中文文档

RFC 7239 定义了 HTTP 标头 代理可以使用它来提供有关原始请求的信息。还有其他 非标准标头,包括 、 、 、 和 。ForwardedX-Forwarded-HostX-Forwarded-PortX-Forwarded-ProtoX-Forwarded-SslX-Forwarded-PrefixSpring中文文档

ForwardedHeaderTransformer是修改主机、端口和方案的组件 该请求基于转发的标头,然后删除这些标头。如果您声明 它作为具有名称的 Bean ,它将被检测和使用。forwardedHeaderTransformerSpring中文文档

转发的标头存在安全注意事项,因为应用程序无法知道 如果标头是由代理(按预期)或恶意客户端添加的。这就是为什么 应将信任边界的代理配置为删除来自的不受信任的转发流量 从外面。您还可以配置 with ,在这种情况下,它会删除但不使用标头。ForwardedHeaderTransformerremoveOnly=trueSpring中文文档

在 5.1 中被弃用并被取代,因此转发的标头可以更早地处理,在 Exchange 已创建。如果仍然配置了过滤器,则会将其从列表中删除 过滤器,并改用。ForwardedHeaderFilterForwardedHeaderTransformerForwardedHeaderTransformer
Bean 名称 豆类 计数 描述

<任何>Spring中文文档

WebExceptionHandlerSpring中文文档

0..NSpring中文文档

提供对实例链和目标的异常的处理。有关详细信息,请参阅例外WebFilterWebHandlerSpring中文文档

<任何>Spring中文文档

WebFilterSpring中文文档

0..NSpring中文文档

将拦截样式逻辑应用于筛选器链的其余部分之前和之后,以及 目标 .有关详细信息,请参阅筛选器WebHandlerSpring中文文档

webHandlerSpring中文文档

WebHandlerSpring中文文档

1Spring中文文档

请求的处理程序。Spring中文文档

webSessionManagerSpring中文文档

WebSessionManagerSpring中文文档

0..1Spring中文文档

通过 上的方法公开的实例的管理器。 默认情况下。WebSessionServerWebExchangeDefaultWebSessionManagerSpring中文文档

serverCodecConfigurerSpring中文文档

ServerCodecConfigurerSpring中文文档

0..1Spring中文文档

用于访问用于解析表单数据和分段数据的实例,然后 通过 上的方法公开。 默认情况下。HttpMessageReaderServerWebExchangeServerCodecConfigurer.create()Spring中文文档

localeContextResolverSpring中文文档

LocaleContextResolverSpring中文文档

0..1Spring中文文档

通过 上的方法公开的解析器。 默认情况下。LocaleContextServerWebExchangeAcceptHeaderLocaleContextResolverSpring中文文档

forwardedHeaderTransformerSpring中文文档

ForwardedHeaderTransformerSpring中文文档

0..1Spring中文文档

用于处理转发类型标头,通过提取和删除它们或仅删除它们。 默认情况下不使用。Spring中文文档

在 5.1 中被弃用并被取代,因此转发的标头可以更早地处理,在 Exchange 已创建。如果仍然配置了过滤器,则会将其从列表中删除 过滤器,并改用。ForwardedHeaderFilterForwardedHeaderTransformerForwardedHeaderTransformer

过滤 器

WebHandler API 中,您可以使用 来应用拦截样式 在过滤器和目标的处理链的其余部分之前和之后的逻辑。使用 WebFlux Config 时,注册 a 非常简单 将其声明为 Spring Bean 并(可选)通过使用 on 来表达优先级 Bean 声明或通过实现 .WebFilterWebHandlerWebFilter@OrderOrderedSpring中文文档

CORS(核心斯酒店)

Spring WebFlux 通过对 CORS 配置的注释提供细粒度支持 控制器。但是,当您将其与 Spring Security 一起使用时,我们建议您依赖内置的 ,必须在 Spring Security 的过滤器链之前订购。CorsFilterSpring中文文档

有关详细信息,请参阅有关 CORSCORS WebFilter 的部分。Spring中文文档

异常

WebHandler API 中,您可以使用 来处理 来自实例链和目标的异常。使用 WebFlux Config 时,注册 a 就像将其声明为 Spring bean 和(可选)通过在 bean 声明上使用 或 通过实现 .WebExceptionHandlerWebFilterWebHandlerWebExceptionHandler@OrderOrderedSpring中文文档

下表描述了可用的实现:WebExceptionHandlerSpring中文文档

异常处理程序 描述

ResponseStatusExceptionHandlerSpring中文文档

通过将响应设置为异常的 HTTP 状态代码,提供对 ResponseStatusException 类型的异常的处理。Spring中文文档

WebFluxResponseStatusExceptionHandlerSpring中文文档

扩展也可以确定 HTTP 状态 任何异常的注释代码。ResponseStatusExceptionHandler@ResponseStatusSpring中文文档

此处理程序在 WebFlux Config 中声明。Spring中文文档

异常处理程序 描述

ResponseStatusExceptionHandlerSpring中文文档

通过将响应设置为异常的 HTTP 状态代码,提供对 ResponseStatusException 类型的异常的处理。Spring中文文档

WebFluxResponseStatusExceptionHandlerSpring中文文档

扩展也可以确定 HTTP 状态 任何异常的注释代码。ResponseStatusExceptionHandler@ResponseStatusSpring中文文档

此处理程序在 WebFlux Config 中声明。Spring中文文档

编 解码 器

和 模块支持序列化和 通过非阻塞 I/O 将字节内容反序列化到更高级别的对象和从更高级别的对象反序列化 反应流背压。下面介绍了此支持:spring-webspring-coreSpring中文文档

该模块提供 、 、 、该模块提供 Jackson JSON、Jackson Smile、JAXB2、协议缓冲区和其他编码器和解码器以及 表单数据、多部分内容、 服务器发送的事件等。spring-corebyte[]ByteBufferDataBufferResourceStringspring-webSpring中文文档

ClientCodecConfigurer通常用于配置和 自定义要在应用程序中使用的编解码器。请参阅有关配置 HTTP 消息编解码器的部分。ServerCodecConfigurerSpring中文文档

杰克逊 JSON

JSON 和二进制 JSON (Smile) 是 当 Jackson 库存在时,两者都受支持。Spring中文文档

作品如下:Jackson2DecoderSpring中文文档

  • Jackson 的异步非阻塞解析器用于聚合字节块流 into 的每个表示一个 JSON 对象。TokenBufferSpring中文文档

  • 每个都传递给 Jackson's 以创建更高级别的对象。TokenBufferObjectMapperSpring中文文档

  • 当解码到单值发布者(例如)时,有一个 .MonoTokenBufferSpring中文文档

  • 当解码到多值发布者(例如)时,每个都传递给 一旦为完全形成的对象接收到足够的字节。这 输入内容可以是 JSON 数组,也可以是任何以行分隔的 JSON 格式,例如 NDJSON, JSON 行或 JSON 文本序列。FluxTokenBufferObjectMapperSpring中文文档

作品如下:Jackson2EncoderSpring中文文档

  • 对于单个值发布者(例如),只需通过 .MonoObjectMapperSpring中文文档

  • 对于具有 的多值发布者,默认情况下收集 的值,然后序列化生成的集合。application/jsonFlux#collectToList()Spring中文文档

  • 对于具有流媒体类型(如 或)、编码、写入和 使用行分隔的 JSON 格式单独刷新每个值。其他 流媒体类型可以注册到编码器。application/x-ndjsonapplication/stream+x-jackson-smileSpring中文文档

  • 对于 SSE,将按事件调用,并刷新输出以确保 毫不拖延地交货。Jackson2EncoderSpring中文文档

默认情况下,两者都不支持 类型的元素。相反,默认假设是一个字符串或字符串序列 表示序列化的 JSON 内容,由 .如果什么 您需要从 、 使用 和 中渲染一个 JSON 数组 对 .Jackson2EncoderJackson2DecoderStringCharSequenceEncoderFlux<String>Flux#collectToList()Mono<List<String>>Spring中文文档

表单数据

FormHttpMessageReader并支持解码和编码内容。FormHttpMessageWriterapplication/x-www-form-urlencodedSpring中文文档

在经常需要从多个位置访问表单内容的服务器端,提供分析内容的专用方法 through,然后缓存结果以供重复访问。 请参阅WebHandler API部分中的表单数据ServerWebExchangegetFormData()FormHttpMessageReaderSpring中文文档

一旦使用,就无法再从 请求正文。因此,应用程序应一致地访问缓存的表单数据,而不是从原始请求正文中读取数据。getFormData()ServerWebExchangeSpring中文文档

多部分

MultipartHttpMessageReader并支持解码和 对“多部分/表单数据”、“多部分/混合”和“多部分/相关”内容进行编码。 反过来,将委托给另一个进行实际解析,然后简单地将部分收集到 a 中。 默认情况下,使用 ,但可以通过 进行更改。 有关 的更多信息,请参阅 DefaultPartHttpMessageReader 的 javadocMultipartHttpMessageWriterMultipartHttpMessageReaderHttpMessageReaderFlux<Part>MultiValueMapDefaultPartHttpMessageReaderServerCodecConfigurerDefaultPartHttpMessageReaderSpring中文文档

在服务器端,可能需要从多个区域访问多部分表单内容 places,提供解析 内容通过,然后缓存结果以供重复访问。 请参阅 WebHandler API 部分中的分段数据ServerWebExchangegetMultipartData()MultipartHttpMessageReaderSpring中文文档

一旦使用,就无法再从 请求正文。因此,应用程序必须始终如一地使用对零件的重复、类似映射的访问,或者以其他方式依赖 对 .getMultipartData()getMultipartData()SynchronossPartHttpMessageReaderFlux<Part>Spring中文文档

限制

Decoder以及缓冲部分或全部输入的实现 可以对内存中要缓冲的最大字节数进行配置。 在某些情况下,缓冲是因为输入被聚合并表示为单个 对象 — 例如,具有 、 数据等的控制器方法。在流式处理中也可以发生缓冲,当 拆分输入流 — 例如,分隔文本、JSON 对象流和 依此类推。对于这些流式处理案例,该限制适用于关联的字节数 流中有一个对象。HttpMessageReader@RequestBody byte[]x-www-form-urlencodedSpring中文文档

要配置缓冲区大小,您可以检查给定或公开属性,如果是,Javadoc 将包含有关缺省的详细信息 值。在服务器端,提供一个位置 设置所有编解码器,请参阅 HTTP 消息编解码器。在客户端,限制 所有编解码器都可以在 WebClient.Builder 中更改。DecoderHttpMessageReadermaxInMemorySizeServerCodecConfigurerSpring中文文档

对于分段分析属性限制 非文件部件的大小。对于文件部件,它确定部件的阈值 写入磁盘。对于写入磁盘的文件部件,有一个附加属性来限制每个部件的磁盘空间量。还有 一个属性,用于限制分组请求中的部件总数。 若要在 WebFlux 中配置这三个,需要提供 to 的预配置实例。maxInMemorySizemaxDiskUsagePerPartmaxPartsMultipartHttpMessageReaderServerCodecConfigurerSpring中文文档

流式传输到 HTTP 响应(例如,,)时,定期发送数据非常重要,以便 尽早可靠地检测断开连接的客户端。这样的发送可能是 仅注释、空 SSE 事件或任何其他“无操作”数据,这些数据将有效地用作 心跳。text/event-streamapplication/x-ndjsonSpring中文文档

DataBuffer

DataBuffer是 WebFlux 中字节缓冲区的表示形式。Spring Core 部分 此参考在“数据缓冲区和编解码器”一节中对此进行了更多介绍。要了解的关键点是,在某些 像 Netty 这样的服务器,字节缓冲区是池化的,引用计数,必须释放 使用时以避免内存泄漏。Spring中文文档

WebFlux 应用程序通常不需要关注此类问题,除非它们 直接使用或生成数据缓冲区,而不是依赖编解码器来转换为 以及来自更高级别的对象,或者除非他们选择创建自定义编解码器。对于这样的 案例请查看数据缓冲区和编解码器中的信息, 尤其是关于使用 DataBuffer 的部分。Spring中文文档

默认情况下,两者都不支持 类型的元素。相反,默认假设是一个字符串或字符串序列 表示序列化的 JSON 内容,由 .如果什么 您需要从 、 使用 和 中渲染一个 JSON 数组 对 .Jackson2EncoderJackson2DecoderStringCharSequenceEncoderFlux<String>Flux#collectToList()Mono<List<String>>Spring中文文档

Logging

DEBUGSpring WebFlux 中的关卡日志记录被设计为紧凑、最小且 人性化。它侧重于对 和 与仅在调试特定问题时有用的其他方法相比。Spring中文文档

TRACE级别日志记录通常遵循与(例如,也 不应该是消防水带),但可用于调试任何问题。此外,一些日志 消息可能会在 vs 中显示不同级别的详细信息。DEBUGTRACEDEBUGSpring中文文档

良好的日志记录来自使用日志的经验。如果你发现任何 未达到既定目标,请告知我们。Spring中文文档

日志 ID

在 WebFlux 中,单个请求可以在多个线程和线程 ID 上运行 对于关联属于特定请求的日志消息没有用。这就是为什么 默认情况下,WebFlux 日志消息以特定于请求的 ID 为前缀。Spring中文文档

在服务器端,日志 ID 存储在属性中 (LOG_ID_ATTRIBUTE), 而基于该 ID 的完全格式化前缀可从 .另一方面,日志 ID 存储在属性中 (LOG_ID_ATTRIBUTE) ,而完全格式化的前缀可从 获得。ServerWebExchangeServerWebExchange#getLogPrefix()WebClientClientRequestClientRequest#logPrefix()Spring中文文档

敏感数据

DEBUG日志记录可以记录敏感信息。这就是为什么表单参数和 默认情况下,标头被屏蔽,您必须显式完全启用其日志记录。TRACESpring中文文档

以下示例演示如何对服务器端请求执行此操作:Spring中文文档

@Configuration
@EnableWebFlux
class MyConfig implements WebFluxConfigurer {

	@Override
	public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
		configurer.defaultCodecs().enableLoggingRequestDetails(true);
	}
}
@Configuration
@EnableWebFlux
class MyConfig : WebFluxConfigurer {

	override fun configureHttpMessageCodecs(configurer: ServerCodecConfigurer) {
		configurer.defaultCodecs().enableLoggingRequestDetails(true)
	}
}

以下示例演示如何对客户端请求执行此操作:Spring中文文档

Consumer<ClientCodecConfigurer> consumer = configurer ->
		configurer.defaultCodecs().enableLoggingRequestDetails(true);

WebClient webClient = WebClient.builder()
		.exchangeStrategies(strategies -> strategies.codecs(consumer))
		.build();
val consumer: (ClientCodecConfigurer) -> Unit  = { configurer -> configurer.defaultCodecs().enableLoggingRequestDetails(true) }

val webClient = WebClient.builder()
		.exchangeStrategies({ strategies -> strategies.codecs(consumer) })
		.build()

附录

SLF4J 和 Log4J 2 等日志记录库提供了异步记录器,可避免 阻塞。虽然这些有其自身的缺点,例如可能会丢弃消息 无法排队进行日志记录,它们是目前最好的可用选项 用于反应式、非阻塞式应用。Spring中文文档

自定义编解码器

应用程序可以注册自定义编解码器以支持其他媒体类型, 或默认编解码器不支持的特定行为。Spring中文文档

开发人员表示的某些配置选项在默认编解码器上强制执行。 自定义编解码器可能希望有机会与这些首选项保持一致, 例如强制执行缓冲限制记录敏感数据Spring中文文档

以下示例演示如何对客户端请求执行此操作:Spring中文文档

WebClient webClient = WebClient.builder()
		.codecs(configurer -> {
				CustomDecoder decoder = new CustomDecoder();
                   configurer.customCodecs().registerWithDefaultConfig(decoder);
		})
		.build();
val webClient = WebClient.builder()
		.codecs({ configurer ->
				val decoder = CustomDecoder()
           		configurer.customCodecs().registerWithDefaultConfig(decoder)
		 })
		.build()