spring cloud zuul增加header傳輸?shù)牟僮?/h1>
更新時(shí)間:2021年06月25日 10:18:06 作者:zhuwei_clark
這篇文章主要介紹了spring cloud zuul增加header傳輸?shù)牟僮?,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
spring cloud zuul增加header傳輸
在使用OAuth2.0傳輸權(quán)限認(rèn)證,為了再調(diào)用其他的項(xiàng)目的時(shí)候獲取token,必須在token下傳到其他各個(gè)服務(wù)
@Component
public class KeyUserFilter extends ZuulFilter {
private static final Logger logger = LoggerFactory.getLogger(KeyUserFilter.class);
@Override
public Object run() {
// TODO Auto-generated method stub
String keyCloakUser = CurrentUser.getInstance().getCurrentAuditor();
String keyCloakUserName = CurrentUser.getInstance().getCurrentAuditorName();
String nickname = CurrentUser.getInstance().getCurrentNickname();
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest req = (HttpServletRequest)RequestContext.getCurrentContext().getRequest();
requestContext.addZuulRequestHeader("authorization", req.getHeader("authorization"));
return null;
}
@Override
public boolean shouldFilter() {
// TODO Auto-generated method stub
return true; //表示是否需要執(zhí)行該filter,true表示執(zhí)行,false表示不執(zhí)行
}
@Override
public int filterOrder() {
// TODO Auto-generated method stub
return 0;
}
@Override
public String filterType() {
// TODO Auto-generated method stub
return "pre"; //定義filter的類型,有pre、route、post、error四種
}
}
在其他服務(wù)中,使用HttpServletRequest 通過getHeader方法獲取獲取Token值即可,然后在傳給其他調(diào)用
spring cloud zuul 修改轉(zhuǎn)發(fā)傳遞的參數(shù)
在使用 springcloud zuul 進(jìn)行轉(zhuǎn)發(fā)請求到各個(gè)對應(yīng)的服務(wù)中, 像 校驗(yàn) 請求權(quán)限之類的可以放 zuul的攔截器中,有些時(shí)候我們就需要增加或者減傷轉(zhuǎn)發(fā)時(shí)帶過去的對應(yīng)的一些參數(shù).
貼增加轉(zhuǎn)發(fā)參數(shù)的代碼
public static void setReqParams() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
// 一定要get一下,下面這行代碼才能取到值... [注1]
request.getParameterMap();
Map<String, List<String>> requestQueryParams = ctx.getRequestQueryParams();
if (requestQueryParams==null) {
requestQueryParams=new HashMap<>();
}
//將要新增的參數(shù)添加進(jìn)去,被調(diào)用的微服務(wù)可以直接 去取,就想普通的一樣,框架會直接注入進(jìn)去
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("1");
requestQueryParams.put("test", arrayList);
ctx.setRequestQueryParams(requestQueryParams);
}
就簡單幾行代碼,重要的是最后一行
ctx.setRequestQueryParams(requestQueryParams);
這個(gè)put(“requestQueryParams”, qp); 是在源碼中 會在轉(zhuǎn)發(fā)的時(shí)候去取這個(gè)key里面的參數(shù)值.
也就是說zuul在轉(zhuǎn)發(fā)請求的時(shí)候,最終取的是這個(gè).
然后 是 [注1], 這個(gè)地方, 一般來說,如果你的filter 的 filterOrder() 也就是過濾器順序設(shè)定的比較晚,可以不需要這一行代碼,(之所以這樣是因?yàn)樵谠创a中,后續(xù)的攔截器會執(zhí)行這樣一段程序:將所有傳遞的參數(shù)取出來,再setRequestQueryParams 中,執(zhí)行順序晚就 是框架中設(shè)定的filter執(zhí)行過一次了)
但是如果你的執(zhí)行順序是0 也就是最先執(zhí)行的話,這樣代碼必不可少,如果沒有這行代碼,將不會有值,也就無法達(dá)到修改傳遞參數(shù)的目的.(之前 沒有查看源碼和文檔,還傻乎乎的把從request里面取出來的值 一個(gè)一個(gè)給set進(jìn)去,導(dǎo)致參數(shù)重復(fù).)
這里可以將 定義為流的方式的參數(shù)取出來,set進(jìn)去,方便后面的微服務(wù)獲取.減少相關(guān)取值代碼
就是這種
ServletInputStream inputStream = request.getInputStream();
String copyToString = StreamUtils.copyToString(inputStream, Charset.forName(“UTF-8”));
取出來是字符串(字符串的格式j(luò)son或者xml都行) 然后set進(jìn)去即可
還有一種將信息放到header 通過header傳遞
缺點(diǎn):header傳遞中文需要特殊處理不然亂碼
網(wǎng)關(guān)
RequestContext ctx = RequestContext.getCurrentContext();
ctx.addZuulRequestHeader("original_requestURL",request.getRequestURL().toString());
子系統(tǒng)
request.getHeader("original_requestURL")
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
-
SpringMVC前后端傳值的幾種實(shí)現(xiàn)方式
本文主要介紹了SpringMVC前后端傳值的方式實(shí)現(xiàn),包括使用HttpServletRequest、HttpSession、Model和ModelAndView等方法,具有一定的參考價(jià)值,感興趣的可以了解一下 2025-02-02
-
Java Chassis3注冊中心分區(qū)隔離技術(shù)解密
這篇文章主要為大家介紹了Java Chassis3注冊中心分區(qū)隔離技術(shù)解密,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪 2024-01-01
-
SpringBoot動態(tài)定時(shí)功能實(shí)現(xiàn)方案詳解
在SpringBoot項(xiàng)目中簡單使用定時(shí)任務(wù),不過由于要借助cron表達(dá)式且都提前定義好放在配置文件里,不能在項(xiàng)目運(yùn)行中動態(tài)修改任務(wù)執(zhí)行時(shí)間,實(shí)在不太靈活?,F(xiàn)在我們就來實(shí)現(xiàn)可以動態(tài)修改cron表達(dá)式的定時(shí)任務(wù),感興趣的可以了解一下 2022-11-11
-
Java instanceof關(guān)鍵字的的進(jìn)一步理解
這篇文章主要介紹了Java instanceof關(guān)鍵字的的進(jìn)一步理解,本文用一些實(shí)例講解了instanceof操作符的一些知識,需要的朋友可以參考下 2015-03-03
-
使用Java實(shí)現(xiàn)構(gòu)建jenkins的多個(gè)job并返回構(gòu)建結(jié)果示例
這篇文章主要介紹了使用Java實(shí)現(xiàn)構(gòu)建jenkins的多個(gè)job并返回構(gòu)建結(jié)果示例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧 2020-05-05
-
java啟動jar包修改JVM默認(rèn)內(nèi)存問題
這篇文章主要介紹了java啟動jar包修改JVM默認(rèn)內(nèi)存問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教 2023-02-02
最新評論
spring cloud zuul增加header傳輸
在使用OAuth2.0傳輸權(quán)限認(rèn)證,為了再調(diào)用其他的項(xiàng)目的時(shí)候獲取token,必須在token下傳到其他各個(gè)服務(wù)
@Component
public class KeyUserFilter extends ZuulFilter {
private static final Logger logger = LoggerFactory.getLogger(KeyUserFilter.class);
@Override
public Object run() {
// TODO Auto-generated method stub
String keyCloakUser = CurrentUser.getInstance().getCurrentAuditor();
String keyCloakUserName = CurrentUser.getInstance().getCurrentAuditorName();
String nickname = CurrentUser.getInstance().getCurrentNickname();
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest req = (HttpServletRequest)RequestContext.getCurrentContext().getRequest();
requestContext.addZuulRequestHeader("authorization", req.getHeader("authorization"));
return null;
}
@Override
public boolean shouldFilter() {
// TODO Auto-generated method stub
return true; //表示是否需要執(zhí)行該filter,true表示執(zhí)行,false表示不執(zhí)行
}
@Override
public int filterOrder() {
// TODO Auto-generated method stub
return 0;
}
@Override
public String filterType() {
// TODO Auto-generated method stub
return "pre"; //定義filter的類型,有pre、route、post、error四種
}
}
在其他服務(wù)中,使用HttpServletRequest 通過getHeader方法獲取獲取Token值即可,然后在傳給其他調(diào)用
spring cloud zuul 修改轉(zhuǎn)發(fā)傳遞的參數(shù)
在使用 springcloud zuul 進(jìn)行轉(zhuǎn)發(fā)請求到各個(gè)對應(yīng)的服務(wù)中, 像 校驗(yàn) 請求權(quán)限之類的可以放 zuul的攔截器中,有些時(shí)候我們就需要增加或者減傷轉(zhuǎn)發(fā)時(shí)帶過去的對應(yīng)的一些參數(shù).
貼增加轉(zhuǎn)發(fā)參數(shù)的代碼
public static void setReqParams() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
// 一定要get一下,下面這行代碼才能取到值... [注1]
request.getParameterMap();
Map<String, List<String>> requestQueryParams = ctx.getRequestQueryParams();
if (requestQueryParams==null) {
requestQueryParams=new HashMap<>();
}
//將要新增的參數(shù)添加進(jìn)去,被調(diào)用的微服務(wù)可以直接 去取,就想普通的一樣,框架會直接注入進(jìn)去
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("1");
requestQueryParams.put("test", arrayList);
ctx.setRequestQueryParams(requestQueryParams);
}
就簡單幾行代碼,重要的是最后一行
ctx.setRequestQueryParams(requestQueryParams);
這個(gè)put(“requestQueryParams”, qp); 是在源碼中 會在轉(zhuǎn)發(fā)的時(shí)候去取這個(gè)key里面的參數(shù)值.
也就是說zuul在轉(zhuǎn)發(fā)請求的時(shí)候,最終取的是這個(gè).
然后 是 [注1], 這個(gè)地方, 一般來說,如果你的filter 的 filterOrder() 也就是過濾器順序設(shè)定的比較晚,可以不需要這一行代碼,(之所以這樣是因?yàn)樵谠创a中,后續(xù)的攔截器會執(zhí)行這樣一段程序:將所有傳遞的參數(shù)取出來,再setRequestQueryParams 中,執(zhí)行順序晚就 是框架中設(shè)定的filter執(zhí)行過一次了)
但是如果你的執(zhí)行順序是0 也就是最先執(zhí)行的話,這樣代碼必不可少,如果沒有這行代碼,將不會有值,也就無法達(dá)到修改傳遞參數(shù)的目的.(之前 沒有查看源碼和文檔,還傻乎乎的把從request里面取出來的值 一個(gè)一個(gè)給set進(jìn)去,導(dǎo)致參數(shù)重復(fù).)
這里可以將 定義為流的方式的參數(shù)取出來,set進(jìn)去,方便后面的微服務(wù)獲取.減少相關(guān)取值代碼
就是這種
ServletInputStream inputStream = request.getInputStream(); String copyToString = StreamUtils.copyToString(inputStream, Charset.forName(“UTF-8”));
取出來是字符串(字符串的格式j(luò)son或者xml都行) 然后set進(jìn)去即可
還有一種將信息放到header 通過header傳遞
缺點(diǎn):header傳遞中文需要特殊處理不然亂碼
網(wǎng)關(guān)
RequestContext ctx = RequestContext.getCurrentContext();
ctx.addZuulRequestHeader("original_requestURL",request.getRequestURL().toString());
子系統(tǒng)
request.getHeader("original_requestURL")
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringMVC前后端傳值的幾種實(shí)現(xiàn)方式
本文主要介紹了SpringMVC前后端傳值的方式實(shí)現(xiàn),包括使用HttpServletRequest、HttpSession、Model和ModelAndView等方法,具有一定的參考價(jià)值,感興趣的可以了解一下2025-02-02
Java Chassis3注冊中心分區(qū)隔離技術(shù)解密
這篇文章主要為大家介紹了Java Chassis3注冊中心分區(qū)隔離技術(shù)解密,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
SpringBoot動態(tài)定時(shí)功能實(shí)現(xiàn)方案詳解
在SpringBoot項(xiàng)目中簡單使用定時(shí)任務(wù),不過由于要借助cron表達(dá)式且都提前定義好放在配置文件里,不能在項(xiàng)目運(yùn)行中動態(tài)修改任務(wù)執(zhí)行時(shí)間,實(shí)在不太靈活?,F(xiàn)在我們就來實(shí)現(xiàn)可以動態(tài)修改cron表達(dá)式的定時(shí)任務(wù),感興趣的可以了解一下2022-11-11
Java instanceof關(guān)鍵字的的進(jìn)一步理解
這篇文章主要介紹了Java instanceof關(guān)鍵字的的進(jìn)一步理解,本文用一些實(shí)例講解了instanceof操作符的一些知識,需要的朋友可以參考下2015-03-03
使用Java實(shí)現(xiàn)構(gòu)建jenkins的多個(gè)job并返回構(gòu)建結(jié)果示例
這篇文章主要介紹了使用Java實(shí)現(xiàn)構(gòu)建jenkins的多個(gè)job并返回構(gòu)建結(jié)果示例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
java啟動jar包修改JVM默認(rèn)內(nèi)存問題
這篇文章主要介紹了java啟動jar包修改JVM默認(rèn)內(nèi)存問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02

