当前位置: 首页 > 知识库问答 >
问题:

Spring webflux无阻塞响应

从智明
2023-03-14
public Mono<ServerResponse> handleLogin(ServerRequest request) {
    User body = request.bodyToMono(User.class).block();
    return userRepository.findById(body.getUsername())
            .filter(user -> passwordEncoder.matches(body.getPassword(), user.getPassword()))
            .flatMap(user -> ServerResponse.ok().body(Mono.just(tokens.store(user)), String.class))
            .switchIfEmpty(ServerResponse.badRequest().build());
}
    return request.bodyToMono(User.class)
            .flatMap(body -> userRepository.findById(body.getUsername()).flatMap(user -> Mono.just(new Object[]{body.getPassword(), user})))
            .filter(obj -> {
                User user = (User) obj[1];
                return user.isActive() && passwordEncoder.matches((CharSequence) obj[0], user.getPassword());
            })
            .flatMap(obj -> {
                User user = (User) obj[1];
                return ServerResponse.ok().body(Mono.just(tokens.store(user)), String.class);
            })
            .switchIfEmpty(ServerResponse.badRequest().build());

这是一个非阻塞的解决方案,但看起来并不那么优雅。它能以某种方式改进/简化吗?

共有1个答案

廖令
2023-03-14

1)一切都是流。

2)保持心境平静

3)完全没有阻塞操作。

public Mono<ServerResponse> handleLogin(ServerRequest request) {

    return request.bodyToMono(User.class)
                  .flatMap(body -> userRepository.findById(body.getUsername())
                  .filter(user -> passwordEncoder.matches(body.getPassword(), user.getPassword()))
                  .flatMap(user -> ServerResponse.ok().body(Mono.just(tokens.store(user)), String.class))
                  .switchIfEmpty(ServerResponse.badRequest().build());
}
return request.bodyToMono(User.class)
            .flatMap(body -> userRepository.findById(body.getUsername())                              
                                           .filter(user -> user.isActive())
                                           .filter(user -> passwordEncoder.matches(body.getPassword(), user.getPassword()))
            )
            .flatMap(user -> ServerResponse.ok().syncBody(tokens.store(user)))
            .switchIfEmpty(ServerResponse.badRequest().build());
 类似资料:
  • 下面的代码是否阻止调用,如果是,如何使其成为非阻塞?i、 e.使反应式Java流的使用变得无用?如何在不阻塞呼叫的情况下分页? 目前,我有一个webClient调用后端服务,该服务返回

  • 我有一个带感应帽的覆盆子皮。我制作了一个二进制时钟,我想在Sense hat的显示器上显示并保持更新。然而,我想要的能力,开关时钟与操纵杆中间。一切都很好,除了我的时钟的更新循环阻止任何新的输入一旦启动。 我一直在考虑如何解决这个问题。如何允许脚本/时钟保持运行,并且仍然接受来自操纵杆的新操作。但是一旦while循环开始,我就卡住了。我不知道该用谷歌搜索什么。我已经开始研究async/await,

  • 问题内容: 有没有一种方法可以执行不冻结浏览器的同步AJAX查询?在我看来,在大多数情况下,同步请求要容易得多,但是它们阻止了代码其他部分的执行,这是一个真正的杀手。有没有办法获得同步AJAX而没有负面影响?(是的,我意识到术语“同步AJAX”是矛盾的。) 问题答案: 在即将到来的ECMAScript 2016(ES7)标准中,提供了一组新的语言关键字,这些关键字旨在执行与您似乎正在寻找的目标非常

  • 在上一节中,我们看到了 take Effect 让我们可以在一个集中的地方更好地去描述一个非常规的流程。 重温一下登录流程示例: function* loginFlow() { while(true) { yield take('LOGIN') // ... perform the login logic yield take('LOGOUT') // ...

  • 警告是: jquery-1.9.1.js:8526跨源读取阻塞(CORB)阻塞跨源响应https://www.metaweather.com/api/location/search/?query=loMIME类型应用程序/json。有关更多详细信息,请参阅https://www.chromestatus.com/feature/5629709824032768。 我的代码是: 我试了4个小时,但没

  • 问题内容: 我正在尝试用C语言编写一个程序(在Linux上),该程序将循环直到用户按下某个键为止,但不要求按下键盘来继续每个循环。 有没有简单的方法可以做到这一点?我认为我可以做到这一点,但这似乎需要大量工作。 或者,有没有办法在程序关闭之前捕获- 按键进行清理,而不是非阻塞io? 问题答案: 如前所述,您可以使用ctrl-c 陷阱或任何标准输入。 但是请注意,使用后一种方法时,您还需要设置TTY