如何通過(guò)zuul添加或修改請(qǐng)求參數(shù)
zuul添加或修改請(qǐng)求參數(shù)
一、為什么要用到這個(gè)
在基于 springcloud 構(gòu)建的微服務(wù)系統(tǒng)中,通常使用網(wǎng)關(guān)zuul來(lái)進(jìn)行一些用戶驗(yàn)證等過(guò)濾的操作,比如 用戶在 header 或者 url 參數(shù)中存放了 token ,網(wǎng)關(guān)層需要 用該 token 查出用戶 的 userId ,并存放于 request 中,以便后續(xù)微服務(wù)可以直接使用而避免再去用 token 查詢。
二、基礎(chǔ)知識(shí)
在 zuul 中最大的用法的除了路由之外,就是過(guò)濾器了,自定義過(guò)濾器需實(shí)現(xiàn)接口 ZuulFilter ,在 run() 方法中,可以用
RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest();
獲取到 request,但是在 request 中只有 getParameter() 而沒(méi)有 setParameter() 方法,所以直接修改 url 參數(shù)不可行,另外在 reqeust 中雖然可以使用 setAttribute() ,但是可能由于作用域的不同,在這里設(shè)置的 attribute 在后續(xù)的微服務(wù)中是獲取不到的,因此必須考慮另外的方式。
三、具體做法
最后確定的可行的方法是,用
ctx.setRequest(new HttpServletRequestWrapper(request) {})
的方式,重新構(gòu)造上下文中的 request ,代碼如下:
// 例如在請(qǐng)求參數(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();
}
思路就是,獲取請(qǐng)求的輸入流,并重寫(xiě),即重寫(xiě)json參數(shù)。
在后續(xù)的微服務(wù)的 controller 中,通過(guò)下面的方式獲取通過(guò)zuul添加或修改的請(qǐng)求參數(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修改請(qǐng)求url
除了修改請(qǐng)求參數(shù)、設(shè)置響應(yīng)header,響應(yīng)body外,還有一種需求就是url重新,或者是修改url,這里簡(jiǎn)述一下怎么在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;
}
}
這樣就大功告成了!
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)戰(zhàn)之制作在線音樂(lè)網(wǎng)站
這篇文章主要介紹了如何通過(guò)Java實(shí)現(xiàn)一個(gè)精美風(fēng)的在線音樂(lè)網(wǎng)站,文章采用到了JSP、JQuery、Ajax等技術(shù),感興趣的小伙伴可以了解一下2022-02-02
SpringBoot+Jpa項(xiàng)目配置雙數(shù)據(jù)源的實(shí)現(xiàn)
本文主要介紹了SpringBoot+Jpa項(xiàng)目配置雙數(shù)據(jù)庫(kù)源的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
SpringBoot解析@Value注解型解析注入時(shí)機(jī)及原理分析
@Value注解可以用來(lái)將外部的值動(dòng)態(tài)注入到Bean中,可以獲取配置文件中的屬性值和通過(guò)SpEl表達(dá)式獲取bean的屬性或方法2024-12-12
解決MyEclipse6.5無(wú)法啟動(dòng),一直停留剛開(kāi)始啟動(dòng)界面的詳解
本篇文章是對(duì)解決MyEclipse6.5無(wú)法啟動(dòng),一直停留剛開(kāi)始啟動(dòng)界面的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
Spring Boot啟動(dòng)時(shí)調(diào)用自己的非web邏輯
在spring Boot中,有些代碼是WEB功能,例如API等,但是有些邏輯是非WEB,啟動(dòng)時(shí)就要調(diào)用并持續(xù)運(yùn)行的,該如何加載自己的非WEB邏輯呢,下面通過(guò)實(shí)例代碼給大家講解,一起看看吧2017-07-07
Maven基礎(chǔ):錯(cuò)誤對(duì)應(yīng):was cached in the local&nbs
這篇文章主要介紹了Maven基礎(chǔ):錯(cuò)誤對(duì)應(yīng):was cached in the local repository的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
Spring?myBatis數(shù)據(jù)庫(kù)連接異常問(wèn)題及解決
這篇文章主要介紹了Spring?myBatis數(shù)據(jù)庫(kù)連接異常問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Java每隔兩個(gè)數(shù)刪掉一個(gè)數(shù)問(wèn)題詳解
這篇文章主要介紹了Java每隔兩個(gè)數(shù)刪掉一個(gè)數(shù)問(wèn)題詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

