阿超
>
satoken+webflux获取header以及body问题
自伟大的心灵,而是小人的伎俩。——巴尔扎克
之前分享过一个# satoken+webflux获取header以及body
今天遇到BUG
了
需要在filter
方法结尾添加一个switchIfEmpty(chain.filter(exchange))
否则会导致有一些没有传入body
的请求没有调用到filter
方法导致无响应结果
完整代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| import cn.dev33.satoken.context.SaHolder; import cn.dev33.satoken.context.SaTokenContextForThreadLocalStorage; import cn.dev33.satoken.reactor.context.SaReactorSyncHolder; import cn.dev33.satoken.reactor.filter.SaReactorFilter; import cn.dev33.satoken.router.SaRouter; import jakarta.annotation.Resource; import org.jetbrains.annotations.NotNull; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Lazy; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBufferFactory; import org.springframework.core.io.buffer.DataBufferUtils; import org.springframework.core.io.buffer.DefaultDataBufferFactory; import org.springframework.http.server.reactive.ServerHttpRequestDecorator; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilterChain; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono;
import java.util.Objects;
@Component public class SaReactorFilter extends SaReactorFilter {
@Lazy @Resource private DataBufferFactory dataBufferFactory; @Resource private AgoraProperties agoraProperties;
public SaReactorReactorFilter() { addInclude("/**"); setAuth(router -> { SaRouter.match("/api/rtc/**").check(r -> { var token = SaTokenContextForThreadLocalStorage.getRequest().getHeader("token"); if (token == null) { throw new ApiClientException("请检查请求头是否包含token"); } var requestBody = SaHolder.getStorage().get("requestBody", ""); if (requestBody == null) { throw new ApiClientException("请检查请求体是否为空"); } }); }); }
@Bean public DataBufferFactory dataBufferFactory() { return new DefaultDataBufferFactory(); }
@Override public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) { SaReactorSyncHolder.setContext(exchange); return DataBufferUtils.join(exchange.getRequest().getBody()) .flatMap(dataBuffer -> { String requestBody = DataBufferUtil.dataBufferToString(dataBuffer); SaHolder.getStorage().set("requestBody", requestBody); ServerHttpRequestDecorator decoratedRequest = new ServerHttpRequestDecorator(exchange.getRequest()) { public @Override @NotNull Flux<DataBuffer> getBody() { return Flux.just(dataBufferFactory.wrap(requestBody.getBytes())); } }; return super.filter(exchange.mutate().request(decoratedRequest).build(), chain); }).switchIfEmpty(chain.filter(exchange)); } }
|