如何通過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)文章
Java實(shí)戰(zhàn)之制作在線音樂網(wǎng)站
這篇文章主要介紹了如何通過Java實(shí)現(xiàn)一個精美風(fēng)的在線音樂網(wǎng)站,文章采用到了JSP、JQuery、Ajax等技術(shù),感興趣的小伙伴可以了解一下2022-02-02
SpringBoot+Jpa項(xiàng)目配置雙數(shù)據(jù)源的實(shí)現(xiàn)
本文主要介紹了SpringBoot+Jpa項(xiàng)目配置雙數(shù)據(jù)庫源的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
SpringBoot解析@Value注解型解析注入時機(jī)及原理分析
@Value注解可以用來將外部的值動態(tài)注入到Bean中,可以獲取配置文件中的屬性值和通過SpEl表達(dá)式獲取bean的屬性或方法2024-12-12
解決MyEclipse6.5無法啟動,一直停留剛開始啟動界面的詳解
本篇文章是對解決MyEclipse6.5無法啟動,一直停留剛開始啟動界面的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
Spring Boot啟動時調(diào)用自己的非web邏輯
在spring Boot中,有些代碼是WEB功能,例如API等,但是有些邏輯是非WEB,啟動時就要調(diào)用并持續(xù)運(yùn)行的,該如何加載自己的非WEB邏輯呢,下面通過實(shí)例代碼給大家講解,一起看看吧2017-07-07
Maven基礎(chǔ):錯誤對應(yīng):was cached in the local&nbs
這篇文章主要介紹了Maven基礎(chǔ):錯誤對應(yīng):was cached in the local repository的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03
Spring?myBatis數(shù)據(jù)庫連接異常問題及解決
這篇文章主要介紹了Spring?myBatis數(shù)據(jù)庫連接異常問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06

