加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 19:45:52 所属栏目:Java 来源:网络整理
导读:Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器. Zuul功能: 认证 压力测试 金丝雀测试 动态路由 负载削减 安全 静态响应处理 主动/主动交换管理 Zuul的规则引擎允许通过任何JVM语言来编写规则和过滤器,支持基于Java和Groovy的构建。 配置属性 zuu

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<String,Object> body 
======= 
body.get("userId"); 

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

四.一些尝试

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

总结

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

您可能感兴趣的文章:

  • 深入理解Spring Cloud Zuul过滤器
  • 详解Spring Cloud Zuul中路由配置细节
  • spring cloud zuul修改请求url的方法
  • 深入解析Spring Cloud内置的Zuul过滤器
  • spring cloud如何修复zuul跨域配置异常的问题
  • 详解Spring Cloud Zuul重试机制探秘
  • SpringCloud实战小贴士之Zuul的路径匹配
  • 利用Spring Cloud Zuul实现动态路由示例代码
  • Spring Cloud zuul自定义统一异常处理实现方法
  • Spring Cloud入门教程之Zuul实现API网关与请求过滤

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读