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

网友投稿 334 2023-02-19


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.pripQzAjQonntln("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 getInphttp://utStream() throws IOException {

return new ServletInputStreamWrapphttp://er(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 修改请求参数信息的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,会及时回复大家的。在此也非常感谢大家对我们网站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:hadoop的wordcount实例代码
下一篇:微信接口开发实例(微信接口分析)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~