gpt4 book ai didi

springcloud 中 zuul 修改请求参数信息的方法

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章springcloud 中 zuul 修改请求参数信息的方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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() 方法中,可以用 。

?
1
2
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();

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

三.具体做法 。

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

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

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

?
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
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 中,可以用 形似 。

?
1
2
3
@RequestBody Map<String,Object> body
=======
body.get( "userId" );

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

四.一些尝试 。

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

总结 。

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

原文链接:http://blog.csdn.net/kysmkj/article/details/79092781 。

最后此篇关于springcloud 中 zuul 修改请求参数信息的方法的文章就讲到这里了,如果你想了解更多关于springcloud 中 zuul 修改请求参数信息的方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com