Spring webflux非阻塞响应

时间:2018-01-06 14:18:02

标签: java nonblocking spring-webflux

我有一个请求方法,使用'username'和'password'body参数从数据库中查找真实用户,使用请求密码验证它,如果一切正常 - 将生成的令牌返回为String。

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 个答案:

答案 0 :(得分:2)

记住

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());