Spring WebFlux如何保证Redis会话保存完成后再转发下游请求
问题修复方案
错误原因
你现有代码的核心问题是通过doOnNext(Mono::subscribe)手动订阅会话保存的Mono,导致会话持久化操作和主请求转发流程变成两个互相独立的异步任务,主流程不会等待保存操作完成就会触发下游转发。
正确实现代码
return new OrderedGatewayFilter((exchange, chain) -> exchange.getSession() .doOnNext(session -> { // 此处保留你原有的会话修改逻辑 }) // 用flatMap替代map,将save操作接入主响应流 .flatMap(WebSession::save) // save操作完成后才会执行下游转发 .then(chain.filter(exchange)), SAVE_SESSION_FILTER);
原理说明
WebSession.save()本身返回Mono<Void>,代表异步保存操作的结果flatMap操作符会把save()返回的内部Mono展开接入主请求处理流程,主流程会等待save操作完成(即Redis持久化成功返回)后,才会触发then里的下游转发逻辑- 全程不需要手动调用
subscribe,所有操作的订阅由Spring Reactor的请求上下文统一管理,天然保证执行顺序
可选异常处理
如果需要在会话保存失败时终止转发、返回错误,可以增加异常处理逻辑:
return new OrderedGatewayFilter((exchange, chain) -> exchange.getSession() .doOnNext(session -> { // 会话修改逻辑 }) .flatMap(WebSession::save) .onErrorResume(ex -> { // 自定义保存失败的处理逻辑,比如设置错误响应码 exchange.getResponse().setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR); return exchange.getResponse().setComplete(); }) .then(chain.filter(exchange)), SAVE_SESSION_FILTER);
内容的提问来源于stack exchange,提问作者VIJ
相关产品推荐
相关产品推荐

