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修改请求url的方法,包括了spring cloud zuul修改请求url的方法的使用技巧和注意事项,需要的朋友参考一下 前言 在日常开发中,除了修改请求参数、设置响应header,响应body外,还有一种需求就是url重新,或者是修改url,这里简述一下怎么在zuul修改url。话不多说了,来一起看看详细的介绍吧。 转发配置 filter配置 这
自1.14.0开始,zuul网关支持动态修改请求参数。即在网关修改客户端传递过来的参数,然后发送到微服务端。 客户端参数{"name": "jim"} --> zuul中修改为{"name": "Lucy"} --> 微服务端将收到{"name": "Lucy"} 使用场景:客户端请求参数经过加密,在网关解密后,再次发送明文参数给微服务端 如何使用 在网关springboot启动函数中添加如下代
问题内容: 因此,像往常一样,我尝试在SO上找到这个问题,但还是没有运气。 我知道答案是“是的,您可以修改req对象”,但是关于req对象参数什么也没说。 例如,以下代码将引发错误: 错误: 我想这与没有“ SET”方法的属性有关,或者与之类似。 在某些情况下可以派上用场。 一种将快速链接转换为完整请求并代理这些请求的服务。 只需修改参数,然后再将其发送给您不想修改的其他功能。 问题 是,有没有办
我需要执行修改后的请求,但我有一个问题,我不能很好地理解。在尝试使用代码之前,我用Postman和request测试了api调用,如下所示: 下面是我的android代码: 编辑请求: null
一、修改请求 在上一步中,我们恢复了截获的请求,没有进行任何更改。当我们在将请求转发到目的地之前修改被拦截的请求时,就会发挥拦截的全部功能。您可以继续上一步中的窗口和已配置的拦截规则。 欢迎来到mitmproxy教程。在本课程中,我们将介绍对截获请求的修改。 点击查看教程 二、影片内容 欢迎来到mitmproxy教程。在本课程中,我们将介绍对截获请求的修改。 我们配置和使用与上一教程中相同的拦截规
TP5已经将请求封装为\think\Request,所有的请求信息可以通过请求对象获取; 获取请求对象 请求对象的获取有两种方式: 1.在控制器方法内可以直接通过 request 属性获取: $request = $this->request; 2.在其它地方可以Request的单例方法 $request = Request::instance(); 3.使用助手函数 $request = r