首页 > 解决方案 > 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 将自动订阅它,直到我的流不被执行。

标签: javacookiesreactive-programmingspring-webfluxproject-reactor

解决方案


使用如下参数定义控制器的方法签名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);

推荐阅读