gpt4 book ai didi

java - Spring webflux非阻塞响应

转载 作者:行者123 更新时间:2023-11-30 02:16:49 25 4
gpt4 key购买 nike

我有一个请求方法,它使用“用户名”和“密码”正文参数从数据库中查找真实用户,使用请求密码进行验证,如果一切正常,则将生成的 token 作为字符串返回。

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)一切都是流。

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

关于java - Spring webflux非阻塞响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48128254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com