欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-08-13 20:29:57
zuul是netflix出品的一个基于jvm路由和服务端的负载均衡器.   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() 方法中,可以用

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 修改请求参数信息的方法,希望对大家有所帮助