gateway里面可以自定义普通filter,也可以创建自定义的GlobalFilter。

GlobalFilter实际上还是比较常用的,譬如可以在GlobalFilter里做日志处理、认证鉴权等,这里就涉及一个获取到请求参数的问题。

用户发起Get、Post请求,经过网关gateway,gateway的GlobalFilter进行拦截——获取参数——处理并包装——转到下一级,我们就来看看该怎么获取请求的参数。

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.6.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Finchley.SR1</spring-cloud.version></properties>

Get请求

/*** @author wuweifeng wrote on 2018/10/24.*/
@Component
public class AuthSignFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String token = exchange.getRequest().getQueryParams().getFirst("authToken");if (token == null || token.isEmpty()) {exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}
}

这里定义了一个GlobalFilter,如果是Get请求,就可以通过getQueryParams().getFirst("你的key")的方式来获取。

可以看到已经获取到了Get请求的参数,如果有多个请求参数,就可以通过遍历exchange.getRequest().getQueryParams()来获取。

Post请求

post请求的传参获取相对比较麻烦一些,gateway采用了webflux的方式来封装的请求体。

我们知道post常用的两种传参content-type是application/x-www-form-urlencoded和application/json,这两种方式还是有区别的。

下面来看一下获取Post请求体的方法,关于webflux获取内容的教程请看上一篇。

package com.example.gateway.filter;import io.netty.buffer.ByteBufAllocator;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.core.io.buffer.NettyDataBufferFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;import java.net.URI;
import java.nio.CharBuffer;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;/*** @author wuweifeng wrote on 2018/10/24.*/
@Component
public class AuthSignFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest serverHttpRequest = exchange.getRequest();String method = serverHttpRequest.getMethodValue();if ("POST".equals(method)) {//从请求里获取Post请求体String bodyStr = resolveBodyFromRequest(serverHttpRequest);//TODO 得到Post请求的请求参数后,做你想做的事//下面的将请求体再次封装写回到request里,传到下一级,否则,由于请求体已被消费,后续的服务将取不到值URI uri = serverHttpRequest.getURI();ServerHttpRequest request = serverHttpRequest.mutate().uri(uri).build();DataBuffer bodyDataBuffer = stringBuffer(bodyStr);Flux<DataBuffer> bodyFlux = Flux.just(bodyDataBuffer);request = new ServerHttpRequestDecorator(request) {@Overridepublic Flux<DataBuffer> getBody() {return bodyFlux;}};//封装request,传给下一级return chain.filter(exchange.mutate().request(request).build());} else if ("GET".equals(method)) {Map requestQueryParams = serverHttpRequest.getQueryParams();//TODO 得到Get请求的请求参数后,做你想做的事return chain.filter(exchange);}return chain.filter(exchange);}/*** 从Flux<DataBuffer>中获取字符串的方法* @return 请求体*/private String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest) {//获取请求体Flux<DataBuffer> body = serverHttpRequest.getBody();AtomicReference<String> bodyRef = new AtomicReference<>();body.subscribe(buffer -> {CharBuffer charBuffer = StandardCharsets.UTF_8.decode(buffer.asByteBuffer());DataBufferUtils.release(buffer);bodyRef.set(charBuffer.toString());});//获取request bodyreturn bodyRef.get();}private DataBuffer stringBuffer(String value) {byte[] bytes = value.getBytes(StandardCharsets.UTF_8);NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT);DataBuffer buffer = nettyDataBufferFactory.allocateBuffer(bytes.length);buffer.write(bytes);return buffer;}@Overridepublic int getOrder() {return 0;}
}

这里有详细的获取Post请求体的方法,无论是application/x-www-form-urlencoded和application/json都可以通过上面的方式。

看结果:

下面是@RequestBody形式的

这是后端消费的服务代码

也能正常接收@RequestBody请求并解析。

SpringCloud-gateway全局GlobalFilter获取post的请求参数相关推荐

  1. nodejs获取get/post请求参数

    一.原生node中怎么获取get/post请求参数 处理get请求参数,使用node自带的核心模块----url模块 url.parse();方法将一个完整的URL地址,分为很多部分,常用的有:hos ...

  2. springboot获取多个请求参数_springboot获取URL请求参数的多种方式

    1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交. /** * 1.直接把表单的参数写在Controller相应的方法的形参中 * @pa ...

  3. Python selenium Browsermob-Proxy获取网页加密请求参数的方法及过程

    一.问题 爬虫在获取页面数据时可能会遇到许多页面异步加载.js加密.动态Cookie等问题,我们在做爬虫开发的时候经常用到浏览器的开发者工具,分析网页元素,查看资源加载(Network)等.Selen ...

  4. eggjs 获取各种类型请求参数

    1. query 参数获取 // eg: test?id=1 const { id } = this.ctx.query 2. path 参数获取 // eg: test/:id => test ...

  5. SpringCloud Gateway用法详解

    零.人在月球 目录 零.人在月球 一.功能简介 1.网关是一个服务: 二.Gateway 断言 1.path断言 2.Query断言 3.Method断言 4.Host断言 5.Cookie断言 6. ...

  6. SpringMVC之请求参数的获取方式

    转载出处:https://www.toutiao.com/i6510822190219264516/ SpringMVC之请求参数的获取方式 常见的一个web服务,如何获取请求参数? 一般最常见的请求 ...

  7. java get请求 参数_HttpServletRequest获取GET请求参数5种方法

    首页 > Java Web > SpringMvc应用 > HttpServletRequest HttpServletRequest获取GET请求参数5种方法 HttpServle ...

  8. 关于JAVA中request.getParameterMap与request.getReader()获取不到请求值的解决方案

    最近比较忙,经常加班,已经有一个星期多的时间没写博客了,但是即便再忙,也要把自己认为重要的知识点通过博客的形式记录下来! 最近在维护公司的旧系统时发现公司的旧网关的异步通知定时任务出现延迟的问题,本来 ...

  9. 通过filter过滤器对请求参数进行处理

    遇见的问题: 前台把参数通过报文或者使用表单.ajax提交到后台,如果我们的请求参数是加密的,那么我们在controller里面的每一个方法里都需要进行解密处理.如果方法太多,那就太麻烦了. 设计方案 ...

最新文章

  1. python 中遍历表时候,当指定的表的长度超过实际长度时候,实际遍历的长度以表实际长度为准,不会发生越界,如下
  2. AI每日精选:新加坡批准AI血管超声扫描;蔚来硅谷裁员141人
  3. AI:2020年6月22日北京智源大会演讲分享之19:00-19:40《 圆桌论坛:人工智能产业的下一个十年》
  4. 以效率为根本,网易慢跑要做“另类”的TO B业务
  5. 如何安装python3.7.6_CentOS7安装Python3.7.6,配置pip,安装配置virtualenv和virtualenvwrapper...
  6. 如何将页脚固定在页面底部
  7. java 递归调整为队列
  8. 《 图解 TCP/IP 》读书笔记
  9. java自定义equals函数和hashCode函数
  10. 当你打开网页的时候,世界都发生了什么(1)
  11. php安装oci8和pdo_oci扩展实现连接oracle数据库
  12. java 文件目录操作_Java---文件夹及文件操作
  13. 计算机图形图像处理应用教程,计算机图形图像处理——Photoshop实用教程
  14. 详叙 @vue/cli 和 vue-cli
  15. PHP正则表达式笔记与实例详解
  16. mysqllinux操作,万字解析!
  17. Communications link failure错误(亲测有效)
  18. hortonworks_具有在IBM POWER8上运行的Hortonworks Data Platform(HDP)的SAS软件
  19. 零基础入门网络渗透到底要怎么学?
  20. 在win2008安装GNS3出现的蓝屏问题

热门文章

  1. R语言ggplot2可视化可视化排序的棒棒糖图、类似于排序的条形图(Lollipop Chart)、为可视化图像添加标题和副标题、题注信息、自定义轴坐标文本的角度
  2. c语言 类型转换 小数*int,C语言数据类型转换
  3. CTF Web题 部分WP
  4. 使用el-aside实现切换
  5. SpringBoot配置加载顺序
  6. 常见的距离计算公式——欧式距离(Euclidean Distance)
  7. iphone充电图_如何为iPhone 7充电并同时听音乐
  8. 2019年山东省深思杯网络安全大赛
  9. 2019年深思杯write up(一)
  10. Django+Vue开发生鲜电商平台之10.购物车、订单管理和支付功能