我可以将敏感数据存储在 Quarkus 应用程序的 Vert.x 上下文中吗?
Can I store sensitive data in a Vert.x context in a Quarkus application?
我正在寻找一个地方来存储一些请求范围内的属性,例如使用 Quarkus 请求过滤器的用户 ID。我稍后想在日志处理程序中检索这些属性并将它们放入 MDC 日志记录上下文中。
Vertx.currentContext()
放置这样的请求属性的地方合适吗?或者我在这个上下文中设置的属性可以被其他请求读取吗?
如果这不是存储此类数据的正确位置,那么哪里才是正确的位置?
是...但不是 :-D
Vertx.currentContext()
可以提供两种类型的对象:
- 在此事件循环中执行的所有并发处理之间共享根上下文(因此不共享数据)
- 重复上下文,对处理及其延续而言是本地的(您可以共享这些)
在 Quarkus 2.7.2 中,我们做了很多工作来改进对重复上下文的支持。之前,它们仅用于 HTTP,现在用于 gRPC 和 @ConsumeEvent。 Quarkus 2.8 中即将支持 Kafka 和 AMQP。
此外,在 Quarkus 2.7.2 中,我们引入了两个可能有用的新功能:
- 您不能将数据存储在根上下文中。我们会为您检测并抛出 UnsupportedOperationException。原因是安全。
- 我们引入了一个新的实用程序 class(
io.smallrye.common.vertx.ContextLocals
以访问 context locals。
这是一个简单的例子:
AtomicInteger counter = new AtomicInteger();
public Uni<String> invoke() {
Context context = Vertx.currentContext();
ContextLocals.put("message", "hello");
ContextLocals.put("id", counter.incrementAndGet());
return invokeRemoteService()
// Switch back to our duplicated context:
.emitOn(runnable -> context.runOnContext(runnable))
.map(res -> {
// Can still access the context local data
String msg = ContextLocals.<String>get("message").orElseThrow();
Integer id = ContextLocals.<Integer>get("id").orElseThrow();
return "%s - %s - %d".formatted(res, msg, id);
});
}
我正在寻找一个地方来存储一些请求范围内的属性,例如使用 Quarkus 请求过滤器的用户 ID。我稍后想在日志处理程序中检索这些属性并将它们放入 MDC 日志记录上下文中。
Vertx.currentContext()
放置这样的请求属性的地方合适吗?或者我在这个上下文中设置的属性可以被其他请求读取吗?
如果这不是存储此类数据的正确位置,那么哪里才是正确的位置?
是...但不是 :-D
Vertx.currentContext()
可以提供两种类型的对象:
- 在此事件循环中执行的所有并发处理之间共享根上下文(因此不共享数据)
- 重复上下文,对处理及其延续而言是本地的(您可以共享这些)
在 Quarkus 2.7.2 中,我们做了很多工作来改进对重复上下文的支持。之前,它们仅用于 HTTP,现在用于 gRPC 和 @ConsumeEvent。 Quarkus 2.8 中即将支持 Kafka 和 AMQP。
此外,在 Quarkus 2.7.2 中,我们引入了两个可能有用的新功能:
- 您不能将数据存储在根上下文中。我们会为您检测并抛出 UnsupportedOperationException。原因是安全。
- 我们引入了一个新的实用程序 class(
io.smallrye.common.vertx.ContextLocals
以访问 context locals。
这是一个简单的例子:
AtomicInteger counter = new AtomicInteger();
public Uni<String> invoke() {
Context context = Vertx.currentContext();
ContextLocals.put("message", "hello");
ContextLocals.put("id", counter.incrementAndGet());
return invokeRemoteService()
// Switch back to our duplicated context:
.emitOn(runnable -> context.runOnContext(runnable))
.map(res -> {
// Can still access the context local data
String msg = ContextLocals.<String>get("message").orElseThrow();
Integer id = ContextLocals.<Integer>get("id").orElseThrow();
return "%s - %s - %d".formatted(res, msg, id);
});
}