91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么通過zuul添加或修改請求參數

發布時間:2021-07-27 13:39:55 來源:億速云 閱讀:166 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“怎么通過zuul添加或修改請求參數”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“怎么通過zuul添加或修改請求參數”這篇文章吧。

zuul添加或修改請求參數

一、為什么要用到這個

在基于 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 ,代碼如下:

// 例如在請求參數中添加 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參數。

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

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

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

轉發配置

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;
    }
}

這樣就大功告成了!

以上是“怎么通過zuul添加或修改請求參數”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

韩城市| 邹城市| 长沙市| 儋州市| 柯坪县| 牟定县| 雷州市| 抚顺县| 民勤县| 凤山县| 南和县| 化州市| 九江县| 阿荣旗| 天门市| 巴楚县| 辽阳县| 贵定县| 葵青区| 慈溪市| 平顶山市| 平顺县| 阜阳市| 城口县| 大姚县| 呈贡县| 聂荣县| 元阳县| 惠来县| 焦作市| 陆河县| 古田县| 克什克腾旗| 湖北省| 合肥市| 武清区| 富平县| 汝阳县| 景谷| 沅陵县| 基隆市|