欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何通過zuul添加或修改請求參數(shù)

 更新時間:2021年07月27日 10:14:02   作者:礦泉  
這篇文章主要介紹了如何通過zuul添加或修改請求參數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

zuul添加或修改請求參數(shù)

一、為什么要用到這個

在基于 springcloud 構(gòu)建的微服務(wù)系統(tǒng)中,通常使用網(wǎng)關(guān)zuul來進(jìn)行一些用戶驗(yàn)證等過濾的操作,比如 用戶在 header 或者 url 參數(shù)中存放了 token ,網(wǎng)關(guān)層需要 用該 token 查出用戶 的 userId ,并存放于 request 中,以便后續(xù)微服務(wù)可以直接使用而避免再去用 token 查詢。

二、基礎(chǔ)知識

在 zuul 中最大的用法的除了路由之外,就是過濾器了,自定義過濾器需實(shí)現(xiàn)接口 ZuulFilter ,在 run() 方法中,可以用

RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();

獲取到 request,但是在 request 中只有 getParameter() 而沒有 setParameter() 方法,所以直接修改 url 參數(shù)不可行,另外在 reqeust 中雖然可以使用 setAttribute() ,但是可能由于作用域的不同,在這里設(shè)置的 attribute 在后續(xù)的微服務(wù)中是獲取不到的,因此必須考慮另外的方式。

三、具體做法

最后確定的可行的方法是,用

ctx.setRequest(new HttpServletRequestWrapper(request) {})

的方式,重新構(gòu)造上下文中的 request ,代碼如下:

// 例如在請求參數(shù)中添加 userId
try {
  InputStream in = ctx.getRequest().getInputStream();
  String body = StreamUtils.copyToString(in, Charset.forName("UTF-8"));
  if(StringUtils.isBlank(body)){
    body = "{}";
  }
  JSONObject jsonObject = JSON.parseObject(body);
  jsonObject.put("userId", 666);
  String newBody = jsonObject.toString();
  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參數(shù)。

在后續(xù)的微服務(wù)的 controller 中,通過下面的方式獲取通過zuul添加或修改的請求參數(shù)。

InputStream in = request().getInputStream();
String body = StreamUtils.copyToString(in, Charset.forName("UTF-8"));
if(StringUtils.isNotBlank(body)){
  JSONObject jsonObject = JSON.parseObject(body);
  Object userId = jsonObject.get("userId");
}

zuul修改請求url

除了修改請求參數(shù)、設(shè)置響應(yīng)header,響應(yīng)body外,還有一種需求就是url重新,或者是修改url,這里簡述一下怎么在zuul修改url。

轉(zhuǎn)發(fā)配置

demo:
  ribbon:
    NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
    listOfServers: 192.168.99.100,192.168.99.101
zuul:
  routes:
    demo:
      path: /demo/**
      stripPrefix: true
      serviceId: demo

filter配置

@Component
public class UrlPathFilter extends ZuulFilter{
    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }
    @Override
    public int filterOrder() {
        return FilterConstants.PRE_DECORATION_FILTER_ORDER + 1;
    }
    @Override
    public boolean shouldFilter() {
        final String serviceId = (String) RequestContext.getCurrentContext().get("proxy");
        return "demo".equals(serviceId);
    }
    @Override
    public Object run() {
        RequestContext context = RequestContext.getCurrentContext();
        Object originalRequestPath = context.get(FilterConstants.REQUEST_URI_KEY);
        //http://localhost:10000/demo/list/data
        //-->/api/prefix/list/data
        String modifiedRequestPath = "/api/prefix" + originalRequestPath;
        context.put(FilterConstants.REQUEST_URI_KEY, modifiedRequestPath);
        return null;
    }
}

這樣就大功告成了!

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論