我想知道如何从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);
那么我如何从map函数中保存cookie,并且由于我正在返回流,web流将自动订阅它,直到我的流不执行。
使用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);