springcloud 中中 zuul 修改请求参数信息的方法修改请求参数信息的方法
主要介绍了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();
评论0