doc: 阅读webflux文档

This commit is contained in:
asahi
2025-03-11 00:05:23 +08:00
parent d2e278dcce
commit d44fd7921f

View File

@@ -274,5 +274,34 @@ Mono<MultiValueMap<String, Part>> getMultipartData();
对于`WebFilter`的优先级,欸可以通过使用`@Order`注解或实现`Ordered`接口来实现。 对于`WebFilter`的优先级,欸可以通过使用`@Order`注解或实现`Ordered`接口来实现。
#### CORS #### UrlHandler
spring webflux支持通过@CORSLAI1 在编写web程序时可能希望controller endpoint既能够匹配末尾带`/`的url版本又能匹配末尾不带`/`的url版本。
> 例如,想要让`@GetMapping("/home")`既能够匹配`GET /home`,又能够匹配`GET /home/`。
对此,可以使用`UrlHandlerFilter`进行处理,其支持如下两种配置:
- 当接收到带有末尾带有`/`的url时向浏览器返回一个重定向状态让浏览器重新请求末尾不带`/`的url
- 将请求当作不带末尾`/`,并对请求继续处理
实例化UrlHandlerFilter的示例如下
```java
UrlHandlerFilter urlHandlerFilter = UrlHandlerFilter
// will HTTP 308 redirect "/blog/my-blog-post/" -> "/blog/my-blog-post"
.trailingSlashHandler("/blog/**").redirect(HttpStatus.PERMANENT_REDIRECT)
// will mutate the request to "/admin/user/account/" and make it as "/admin/user/account"
.trailingSlashHandler("/admin/**").mutateRequest()
.build();
```
#### Exceptions
`WebHandler Api`中,可以使用`WebExceptionHandler`对异常进行处理。当使用`Webflux Config`时,注册`WebExceptionHandler`仅需将其声明为bean即可可以通过`@Order`注解或`Ordered`接口来指明顺序。
#### Logging
##### Log Id
在webflux中同一个请求可能在多个线程中被执行过故而在定位请求日志时无法通过线程id来关联请求。为了解决该问题spring webflux在打印消息时前缀了一个`log id`,其是针对单个特定请求的。
在server端log id存储在`ServerWebExchange`中的`LOG_ID_ATTRIBUTE`属性中。在client端log id存储在`Client Request`中的`LOG_ID_ATTRIBUTE`属性中。
##### Appenders
`slf4j``log4j`等日志库都提供异步logger用于避免阻塞。使用异步logger会存在部分缺点例如`丢弃无法排队的异步消息`。但是,其仍然是目前非阻塞框架的最佳选择。