java - Webflux如何从内部流中设置cookie
问题描述
我想知道我可以从 ServerResponse 正文中设置谁的 cookie。
我找到了一些解决方案,但这些解决方案是像这样从外部功能中保存 cookie。
ServerResponse.BodyBuilder response = ServerResponse.ok();
response.cookie(ResponseCookie.from("mycookie", "myVal").build());
return response.body(Mono.just("Welcome"), String.class);
这可以保存 cookie,如果我们没有动态 cookie 值,这个解决方案很好。现在我想写出来自 db 的 cookie 值。
像这样。
return response.body(
Mono.just(101)
.flatMap(i ->
userRepository
.findById(i)
.map(user -> {
Long time = user.getLastLoginTime();
// set time as cookie,
// I would like to save cookie from here
return user.getEmail();
})
)
, String.class);
那么如何从地图函数内部保存 cookie,并且由于我正在返回流,webflux 将自动订阅它,直到我的流不被执行。
解决方案
使用如下参数定义控制器的方法签名ServerWebExchange
:
public Mono<String> cookieSetter(ServerWebExchange exchange)
...然后您可以exchange.getResponse().addCookie()
在反应链中的任何地方使用。(我会这样做作为一个专门的副作用,而不是把它捆绑在一个地图调用中。)所以你可以做类似的事情:
return response.body(
Mono.just(101)
.flatMap(i ->
userRepository
.findById(i)
.doOnNext(user -> {
exchange.getResponse().addCookie(ResponseCookie.from("time", user.getLastLoginTime())
.httpOnly(true)
.build());
})
.map(User::getEmail)
)
, String.class);
推荐阅读
- amazon-web-services - 如何将 S3 数据加载到本地内存中,而不是保存到文件中
- javascript - 网格 Ext JS 中没有禁用行编辑?
- mysql - 左连接 3 个表错误 #1066
- java - 将节点客户端连接到maven服务器端
- python - Shell 脚本 + Python + 树莓派
- javascript - React Native 文件访问 api:blob.data 在 android 上是“未定义”
- python - Python:哪些类型支持弱引用?
- python - 如何制作一个可以处理单个输入或输入列表的函数
- android - 如何知道手机何时连接到 WiFi 网络
- powershell - 多个-ne过滤器powershell