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() 方法中,可以用
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 修改请求参数信息的方法,希望对大家有所帮助
下一篇: 红枣枸杞子姜茶有哪些好处,爱美女性注意了
推荐阅读
-
springcloud 中 zuul 修改请求参数信息的方法
-
yii2 在控制器中验证请求参数的使用方法
-
win10系统修改Cortana搜索栏中的文字信息的方法
-
在Struts2的Action中取得请求参数值的几种方法
-
在Struts2的Action中取得请求参数值的几种方法
-
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
-
Angularjs中$http以post请求通过消息体传递参数的实现方法
-
yii2 在控制器中验证请求参数的使用方法
-
Angularjs中$http以post请求通过消息体传递参数的实现方法
-
win10系统修改Cortana搜索栏中的文字信息的方法