亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

如何通過zuul添加或修改請求參數

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

zuul添加或修改請求參數

一、為什么要用到這個

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

二、基礎知識

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

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

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

三、具體做法

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

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參數。

在后續(xù)的微服務的 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。

轉發(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;
    }
}

這樣就大功告成了!

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java基礎學習之接口詳解

    Java基礎學習之接口詳解

    接口,是Java語言中一種引用類型,是方法的集合,如果說類的內部封裝了成員變量、構造方法和成員方法,那么接口的內部主要就是封裝了方法。本文通過一些示例詳細為大家展示了接口的使用,需要的可以參考一下
    2022-10-10
  • 深入分析@Resource和@Autowired注解區(qū)別

    深入分析@Resource和@Autowired注解區(qū)別

    這篇文章主要為大家介紹了深入分析@Resource和@Autowired注解區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Java的MyBatis框架中實現(xiàn)多表連接查詢和查詢結果分頁

    Java的MyBatis框架中實現(xiàn)多表連接查詢和查詢結果分頁

    這篇文章主要介紹了Java的MyBatis框架中實現(xiàn)多表連接查詢和查詢結果分頁,借助MyBatis框架中帶有的動態(tài)SQL查詢功能可以比普通SQL查詢做到更多,需要的朋友可以參考下
    2016-04-04
  • Spring?security?oauth2以redis作為tokenstore及jackson序列化失敗問題

    Spring?security?oauth2以redis作為tokenstore及jackson序列化失敗問題

    這篇文章主要介紹了Spring?security?oauth2以redis作為tokenstore及jackson序列化失敗問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教<BR>
    2024-04-04
  • Java?Stream流的常見生成和操作方法總結

    Java?Stream流的常見生成和操作方法總結

    從Java1.8開始提出了Stream流的概念,本文將通過示例為大家詳細講解一下Stream流的常見生成和操作方法,感興趣的小伙伴可以了解一下
    2022-09-09
  • Java Serializable和Parcelable詳解及實例代碼

    Java Serializable和Parcelable詳解及實例代碼

    這篇文章主要介紹了Java Serializable和Parcelable詳解,并附實例代碼的相關資料,需要的朋友可以參考下
    2016-09-09
  • java實現(xiàn)航空用戶管理系統(tǒng)

    java實現(xiàn)航空用戶管理系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現(xiàn)航空用戶管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • java 枚舉enum的用法(與在switch中的用法)

    java 枚舉enum的用法(與在switch中的用法)

    這篇文章主要介紹了java 枚舉enum的用法(與在switch中的用法),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Java反射簡易教程

    Java反射簡易教程

    這篇文章主要介紹了Java反射簡易教程,小編覺得挺不錯的,這里分享給大家,需要的朋友可以參考。
    2017-11-11
  • Springcloud RestTemplate服務調用代碼實例

    Springcloud RestTemplate服務調用代碼實例

    這篇文章主要介紹了Springcloud RestTemplate服務調用代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08

最新評論