satoken+webflux获取header以及body

简介: satoken+webflux获取header以及body


你若要喜爱自己的价值,你就得给世界创造价值。——歌德

代码如下:

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;
/**
 * SaReactorFilter
 *
 * @author achao@apache.org
 */
@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 -> {
                // 获取header中的值
                var token = SaTokenContextForThreadLocalStorage.getRequest().getHeader("token");
                if (token == null) {
                    throw new ApiClientException("请检查请求头是否包含token");
                }
                // 获取body
                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);
                });
    }
}

对应的DataBufferUtil

import lombok.experimental.UtilityClass;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferUtils;
import java.nio.charset.StandardCharsets;
/**
 * DataBufferUtil
 *
 * @author achao@apache.org
 */
@UtilityClass
public final class DataBufferUtil {
    public static String dataBufferToString(DataBuffer dataBuffer) {
        byte[] bytes = new byte[dataBuffer.readableByteCount()];
        dataBuffer.read(bytes);
        DataBufferUtils.release(dataBuffer); // 释放DataBuffer资源
        return new String(bytes, StandardCharsets.UTF_8);
    }
}
import lombok.experimental.UtilityClass;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferUtils;
import java.nio.charset.StandardCharsets;
/**
 * DataBufferUtil
 *
 * @author achao@apache.org
 */
@UtilityClass
public final class DataBufferUtil {
    public static String dataBufferToString(DataBuffer dataBuffer) {
        byte[] bytes = new byte[dataBuffer.readableByteCount()];
        dataBuffer.read(bytes);
        DataBufferUtils.release(dataBuffer); // 释放DataBuffer资源
        return new String(bytes, StandardCharsets.UTF_8);
    }
}
目录
打赏
0
0
0
0
30
分享
相关文章
|
8月前
|
Springboot通过SSE实现实时消息返回
通过Spring Boot实现SSE,可以简单高效地将实时消息推送给客户端。虽然SSE有其限制,但对于许多实时消息推送场景而言,它提供了一种简洁而强大的解决方案。在实际开发中,根据具体需求选择合适的技术,可以提高系统的性能和用户体验。希望本文能帮助你深入理解Spring Boot中SSE的实现和应用。
2765 1
Redis - 一篇走心的 RedisUtil 工具类
Redis - 一篇走心的 RedisUtil 工具类
3649 0
Redis - 一篇走心的 RedisUtil 工具类
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(一)
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(一)
455 0
Apifox 网页端调试本地接口
Apifox 网页端调试本地接口
1233 0
|
9月前
微信接口报错 "errcode":40163,"errmsg":"code been used, 如何处理?
【10月更文挑战第11天】微信接口报错 "errcode":40163,"errmsg":"code been used, 如何处理?
4601 1
OpenFeign请求拦截器组件RequestInterceptor原理与使用场景
该文章讲述了OpenFeign中的请求拦截器组件RequestInterceptor的原理及其常见使用场景。
OpenFeign请求拦截器组件RequestInterceptor原理与使用场景
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
17976 0
深度思考:雪花算法snowflake分布式id生成原理详解
雪花算法snowflake是一种优秀的分布式ID生成方案,其优点突出:它能生成全局唯一且递增的ID,确保了数据的一致性和准确性;同时,该算法灵活性强,可自定义各部分bit位,满足不同业务场景的需求;此外,雪花算法生成ID的速度快,效率高,能有效应对高并发场景,是分布式系统中不可或缺的组件。
2815 2
深度思考:雪花算法snowflake分布式id生成原理详解
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问