Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Y
yudao-cloud
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
hblj
yudao-cloud
Commits
b2fc1716
提交
b2fc1716
authored
6月 07, 2022
作者:
YunaiV
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
gateway:完善 AccessLogFilter 的注释
上级
88352fe0
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
13 行增加
和
16 行删除
+13
-16
AccessLogFilter.java
...iocoder/yudao/gateway/filter/logging/AccessLogFilter.java
+13
-16
没有找到文件。
yudao-gateway/src/main/java/cn/iocoder/yudao/gateway/filter/logging/AccessLogFilter.java
浏览文件 @
b2fc1716
...
...
@@ -10,6 +10,7 @@ import org.reactivestreams.Publisher;
import
org.springframework.cloud.gateway.filter.GatewayFilterChain
;
import
org.springframework.cloud.gateway.filter.GlobalFilter
;
import
org.springframework.cloud.gateway.filter.factory.rewrite.CachedBodyOutputMessage
;
import
org.springframework.cloud.gateway.filter.factory.rewrite.ModifyRequestBodyGatewayFilterFactory
;
import
org.springframework.cloud.gateway.support.BodyInserterContext
;
import
org.springframework.cloud.gateway.support.ServerWebExchangeUtils
;
import
org.springframework.core.Ordered
;
...
...
@@ -20,6 +21,7 @@ import org.springframework.core.io.buffer.DefaultDataBufferFactory;
import
org.springframework.http.HttpHeaders
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.http.MediaType
;
import
org.springframework.http.ReactiveHttpOutputMessage
;
import
org.springframework.http.codec.HttpMessageReader
;
import
org.springframework.http.server.reactive.ServerHttpRequest
;
import
org.springframework.http.server.reactive.ServerHttpRequestDecorator
;
...
...
@@ -50,7 +52,6 @@ public class AccessLogFilter implements GlobalFilter, Ordered {
}
@Override
@SuppressWarnings
(
"unchecked"
)
public
Mono
<
Void
>
filter
(
ServerWebExchange
exchange
,
GatewayFilterChain
chain
)
{
// 将 Request 中可以直接获取到的参数,设置到网关日志
ServerHttpRequest
request
=
exchange
.
getRequest
();
...
...
@@ -82,31 +83,28 @@ public class AccessLogFilter implements GlobalFilter, Ordered {
}
/**
* 解决 request body 只能读取一次问题,
* 参考: org.springframework.cloud.gateway.filter.factory.rewrite.ModifyRequestBodyGatewayFilterFactory
* @param exchange
* @param chain
* @param gatewayLog
* @return
* 参考 {@link ModifyRequestBodyGatewayFilterFactory} 实现
*
* 差别主要在于使用 modifiedBody 来读取 Request Body 数据
*/
@SuppressWarnings
(
"unchecked"
)
private
Mono
filterWithRequestBody
(
ServerWebExchange
exchange
,
GatewayFilterChain
chain
,
GatewayLog
gatewayLog
)
{
private
Mono
<
Void
>
filterWithRequestBody
(
ServerWebExchange
exchange
,
GatewayFilterChain
chain
,
GatewayLog
gatewayLog
)
{
// 设置 Request Body 读取时,设置到网关日志
ServerRequest
serverRequest
=
ServerRequest
.
create
(
exchange
,
messageReaders
);
Mono
<
String
>
modifiedBody
=
serverRequest
.
bodyToMono
(
String
.
class
).
flatMap
(
body
->
{
gatewayLog
.
setRequestBody
(
body
);
return
Mono
.
just
(
body
);
});
// 通过 BodyInserter 插入 body(支持修改body), 避免 request body 只能获取一次
BodyInserter
bodyInserter
=
BodyInserters
.
fromPublisher
(
modifiedBody
,
String
.
class
);
// 创建 BodyInserter 对象
BodyInserter
<
Mono
<
String
>,
ReactiveHttpOutputMessage
>
bodyInserter
=
BodyInserters
.
fromPublisher
(
modifiedBody
,
String
.
class
);
// 创建 CachedBodyOutputMessage 对象
HttpHeaders
headers
=
new
HttpHeaders
();
headers
.
putAll
(
exchange
.
getRequest
().
getHeaders
());
// the new content type will be computed by bodyInserter
// and then set in the request decorator
headers
.
remove
(
HttpHeaders
.
CONTENT_LENGTH
);
headers
.
remove
(
HttpHeaders
.
CONTENT_LENGTH
);
// 移除
CachedBodyOutputMessage
outputMessage
=
new
CachedBodyOutputMessage
(
exchange
,
headers
);
// 通过 BodyInserter 将 Request Body 写入到 CachedBodyOutputMessage 中
return
bodyInserter
.
insert
(
outputMessage
,
new
BodyInserterContext
()).
then
(
Mono
.
defer
(()
->
{
// 包装 Request,用于缓存 Request Body
ServerHttpRequest
decoratedRequest
=
requestDecorate
(
exchange
,
headers
,
outputMessage
);
...
...
@@ -120,8 +118,7 @@ public class AccessLogFilter implements GlobalFilter, Ordered {
/**
* 打印日志
* @author javadaily
* @date 2021/3/24 14:53
*
* @param gatewayLog 网关日志
*/
private
void
writeAccessLog
(
GatewayLog
gatewayLog
)
{
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论