资讯 小学 初中 高中 语言 会计职称 学历提升 法考 计算机考试 医护考试 建工考试 教育百科
栏目分类:
子分类:
返回
空麓网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
空麓网 > 计算机考试 > 软件开发 > 后端开发 > Java

【Spring cloud gateway 获取RequestBody】

Java 更新时间: 发布时间: 计算机考试归档 最新发布

【Spring cloud gateway 获取RequestBody】

Spring cloud gateway 获取RequestBody

在gateway中获取请求的json 数据


文章目录

  • Spring cloud gateway 获取RequestBody
  • 环境
  • 一、自定义读取RequestBody的bean
  • 二、自定义根据数据判断是否继续路由的bean
  • 三、修改路由配置
  • 四、怎么获取
    • 创建全局过滤
  • 结束

环境

项目开发所在环境

名称版本号
spring cloud alibaba2021.0.4.0
spring gateway3.1.6
spring boot2.6.11

提示:以下是本篇文章正文内容,下面案例可供参考

一、自定义读取RequestBody的bean

此类主要继承 ReadBodyRoutePredicateFactory 一定要自己查看下此类

import org.springframework.cloud.gateway.handler.predicate.ReadBodyRoutePredicateFactory;import org.springframework.stereotype.Component;@Componentpublic class JsonReadBodyRoutePredicate extends ReadBodyRoutePredicateFactory {// 此类可重写,亦可不重写 ,根据自己需要// 父类方法完全够我用的,所以不做改动}

二、自定义根据数据判断是否继续路由的bean

继承Predicate 由于我们能的json 是字符串 所以是String类型

import org.springframework.stereotype.Component;import java.util.function.Predicate;@Componentpublic class JsonRequestBodyPredicate implements Predicate {        @Override    public boolean test(String reqJson) {        // 这里可以根据 请求字符串 或者 自行添加 path 来判断是否需要继续路由        return true;    }}

三、修改路由配置

(新增) 表示 需要添加的配置

spring:  cloud:    gateway:      discovery:        locator:          enabled: true      routes:        - id: user-server-route          uri: lb://user-server          predicates:            - Path=/user-api//全局过滤器必须实现两个接口:GlobalFilter、Ordered//GlobalFilter是全局过滤器接口,实现类要实现filter()方法进行功能扩展//Ordered接口用于排序,通过实现getOrder()方法返回整数代表执行当前过滤器的前后顺序@Componentpublic class GatewayGlobalFilter implements GlobalFilter, Ordered {    private static final Logger log = LoggerFactory.getLogger(GatewayGlobalFilter.class);    private static final String SERVICE_TIME_BEGIN = "serviceTimeBegin";// 这个放我 我写了记录 接口耗时的方法 有其他需求自行填写    @Override    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {        // 记录请求时间 和 ip        ServerHttpRequest request = exchange.getRequest();        if (null == request) {            exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);            return exchange.getResponse().setComplete();        }        List remoteAddressList = request.getHeaders().get("Remote_address");// 当走nginx转发时,获取此值 真实用户IP        String remoteAddressStr = (null != remoteAddressList && !remoteAddressList.isEmpty()) ? remoteAddressList.get(0) : "empty";        exchange.getAttributes().put(SERVICE_TIME_BEGIN, System.currentTimeMillis());        // 如果需要获取请求头 ,只支持json,其他格式无法解析//        Object reqJson = exchange.getAttributes().get("cachedRequestBodyObject");        return chain.filter(exchange).then(Mono.fromRunnable(() -> {            long endTime = System.currentTimeMillis();            Long startTime = exchange.getAttribute(SERVICE_TIME_BEGIN);            Optional.ofNullable(startTime).ifPresent(l->{                String reqPath = request.getRemoteAddress()+"("+Optional.ofNullable(remoteAddressStr).orElse("empty")+")" + "|" + request.getPath() + "| cost " + (endTime - startTime) + "ms";                log.warn(reqPath);            });        }));    }    @Override    public int getOrder() {        return Ordered.HIGHEST_PRECEDENCE;    }}

结束

转载请注明:文章转载自 http://www.konglu.com/
本文地址:http://www.konglu.com/it/1096473.html
免责声明:

我们致力于保护作者版权,注重分享,被刊用文章【【Spring cloud gateway 获取RequestBody】】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2023 成都空麓科技有限公司

ICP备案号:蜀ICP备2023000828号-2