Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器.

Zuul功能:

认证

压力测试

金丝雀测试

动态路由

负载削减

安全

静态响应处理

主动/主动交换管理

Zuul的规则引擎允许通过任何JVM语言来编写规则和过滤器, 支持基于Java和Groovy的构建。

配置属性 zuul.max.host.connections 已经被两个新的配置属性替代, zuul.host.maxTotalConnections (总连接数)和 zuul.host.maxPerRouteConnections,(每个路由连接数) 默认值分别是200和20.

一. 为什么要用到这个

在基于 springcloud 构建的微服务系统中,通常使用网关zuul来进行一些用户验证等过滤的操作,比如 用户在 header 或者 url 参数中存放了 token ,网关层需要 用该 token 查出用户 的 userId ,并存放于 request 中,以便后续微服务可以直接使用而避免再去用 token 查询。

二.基础知识

在 zuul 中最大的用法的除了路由之外,就是过滤器了,自定义过滤器需实现接口 ZuulFilter ,在 run() 方法中,可以用

RequestContext ctx = RequestContext.getCurrentContext();

HttpServletRequest request = ctx.getRequest();

获取到 request,但是在 request 中只有 getParameter() 而没有 setParameter() 方法,所以直接修改 url 参数不可行,另外在 reqeust 中可以虽然可以使用 setAttribute() ,但是可能由于作用域的不同,在这里设置的 attribute 在后续的微服务中是获取不到的,因此必须考虑另外的方式。

三.具体做法

最后确定的可行的方法是,用

ctx.setRequest(new HttpServletRequestWrapper(request) {})

的方式,重新构造上下文中的 request ,代码如下:

import javax.servlet.http.HttpServletRequestWrapper;

// 在json参数中添加 userId

try {

InputStream in = ctx.getRequest().getInputStream();

String body = StreamUtils.copyToString(in, Charset.forName("UTF-8"));

System.out.println("body:" + body);

JSONObject json = JSONObject.fromObject(body);

json.put("userId", userId);

String newBody = json.toString();

System.out.println("newBody:" + newBody);

final byte[] reqBodyBytes = newBody.getBytes();

ctx.setRequest(new HttpServletRequestWrapper(request){

@Override

public ServletInputStream getInputStream() throws IOException {

return new ServletInputStreamWrapper(reqBodyBytes);

}

@Override

public int getContentLength() {

return reqBodyBytes.length;

}

@Override

public long getContentLengthLong() {

return reqBodyBytes.length;

}

});

} catch (IOException e) {

e.printStackTrace();

}

思路就是,获取请求的输入流,并重写,即重写json参数。

在后续的微服务的 controller 中,可以用 形似

@RequestBody Map body

=======

body.get("userId");

这样的方式,去获取在 zuulFilter 传入的 userId

四.一些尝试

在重写  HttpServletRequestWrapper 的时候,我尝试过 重写getParameterNames()和getParameterMap()方法,希望重写 url 参数,但是并没有生效。

总结

以上所述是小编给大家介绍的springcloud 中 zuul 修改请求参数信息的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

java 修改request中的参数_springcloud 中 zuul 修改请求参数信息的方法相关推荐

  1. java方法带参数返回值_Java方法中的参数太多,第6部分:方法返回

    java方法带参数返回值 在当前的系列文章中,我正在致力于减少调用Java方法和构造函数所需的参数数量,到目前为止,我一直专注于直接影响参数本身的方法( 自定义类型 , 参数对象 , 构建器模式 , ...

  2. Java方法中的参数太多,第6部分:方法返回

    在当前的系列文章中,我正在致力于减少调用Java方法和构造函数所需的参数数量,到目前为止,我一直专注于直接影响参数本身的方法( 自定义类型 , 参数对象 , 构建器模式 , 方法重载和方法命名 ). ...

  3. java中方法的命名_Java方法中的参数太多,第5部分:方法命名

    java中方法的命名 在上一篇文章 (有关处理Java方法中过多参数的系列文章的 第4部分 )中,我将方法重载视为一种向客户提供需要较少参数的版本的方法或构造函数的方法. 我描述了该方法的一些缺点,并 ...

  4. Java方法中的参数太多,第5部分:方法命名

    在上一篇文章 (有关处理Java方法中过多参数的系列文章的 第4部分 )中,我将方法重载视为一种向客户提供需要较少参数的方法版本或构造函数的方法. 我描述了该方法的一些缺点,并建议从方法重载中摆脱出来 ...

  5. jquery中ajax中的参数,jquery中的ajax参数

    jquery中将ajax封装成了函数,我们使用起来非常方便,jquery会自动根据内容选择post还是get方式提交数据,并且会自动编码,但是要想完全掌握jquery中的ajax,我们必须将它的各个参 ...

  6. 将网址url中的参数转化为JSON格式的两种方法

    在我们进入主题前,我先先看下获取网址URL的方法: window.location.href // 设置或获取整个URL为字符串 window.location.hash // 设置或获取href属性 ...

  7. python request post json_python接口之request测试:以json格式发送post请求,.json方法,查看响应结果的情况...

    json和dict python中的dict类型要转换为json格式的数据需要用到json库: importjson = json.dumps() = json.loads() 需要注意的是pytho ...

  8. java 修改 request参数值,如何在HttpServletRequest中设置参数?

    I am using a javax.servlet.http.HttpServletRequest to implement a web application. I have no problem ...

  9. java调用js匿名函数参数,js中匿名函数和回调函数

    匿名函数: 通过这种方式定义的函数:(没有名字的函数) 作用:当它不被赋值给变量单独使用的时候 1.将匿名函数作为参数传递给其他函数 2.定义某个匿名函数来执行某些一次性任务 var f = func ...

  10. js获取url中的参数,url中传递中文的时候通过js解码的方式

    如果传递的参数是: <a href="${pageContext.request.contextPath}/productdisplay/productDisplay_productD ...

最新文章

  1. python语言程序设计2019版第二章课后答案-《Python语言程序设计》 —2.7 课后习题...
  2. OCP大会 | DCOS – 面向数据中心的运营操作系统(附PPT)
  3. 关于流控器件和压控器件
  4. find_path、find_library备忘录
  5. Ignite中的机器学习介绍
  6. 博弈——巴什博弈(hdu1846,2188,2897)
  7. 动手学数理统计(2)
  8. 江苏事业单位计算机类考申论吗,笔试将近!2020年江苏事业单位统考你要注意!...
  9. php 母版 登陆,幻灯片母版的作用有哪些
  10. 制作简单的个人Logo
  11. 手气不错 跳过搜索 谷歌 Google
  12. 算POTCAR要上心!
  13. 【JAVA|Swing】简单表格的制作
  14. 计算机键盘能直接接手机吗,手机变成电脑!将键盘和鼠标连接到智能手机的3种方式...
  15. 基于ESP8266的太空人智能时钟
  16. VS2019安装失败
  17. 华为p30应用软件开启速度测试,华为P30Pro速度测试,与iPhoneXS Max的差距,果粉无法淡定了!...
  18. stay_foolish_stay_hungry(没事多看看)
  19. 牛客每日练习----可做题,汀博尔,轰炸区最优选取
  20. linux获取夏令时时间,关于时区:获取C中时区的夏令时转换日期

热门文章

  1. ST7789-TFT屏幕驱动(整理有stm32/51单片机/arduino等驱动代码)
  2. 零知识证明:一个基于zk-SNARKs的Mastermind棋盘游戏
  3. LevelDB源码分析之四:AtomicPointer
  4. 东芝2510ac请求维修cd40_TOSHIBA东芝2510复印机维修资料
  5. 触摸屏分类和触摸屏校准原理
  6. 我的未来式计算机简谱,我的未来式简谱-爱情公寓歌曲-孙世彦曲谱
  7. TPC-H介绍及实战总结
  8. 【课程设计】俄罗斯方块游戏,重温经典(源码 + 详解)
  9. 办公软件是计算机吗,什么是办公软件_IT /计算机_资料
  10. stm32 代码加密