提问者:小点点

网络流量如何从内部流设置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);

那么我如何从map函数中保存cookie,并且由于我正在返回流,web流将自动订阅它,直到我的流不执行。


共1个答案

匿名用户

使用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);