如何通過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)文章
深入分析@Resource和@Autowired注解區(qū)別
這篇文章主要為大家介紹了深入分析@Resource和@Autowired注解區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04Java的MyBatis框架中實(shí)現(xiàn)多表連接查詢和查詢結(jié)果分頁
這篇文章主要介紹了Java的MyBatis框架中實(shí)現(xiàn)多表連接查詢和查詢結(jié)果分頁,借助MyBatis框架中帶有的動態(tài)SQL查詢功能可以比普通SQL查詢做到更多,需要的朋友可以參考下2016-04-04Spring?security?oauth2以redis作為tokenstore及jackson序列化失敗問題
這篇文章主要介紹了Spring?security?oauth2以redis作為tokenstore及jackson序列化失敗問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教<BR>2024-04-04Java Serializable和Parcelable詳解及實(shí)例代碼
這篇文章主要介紹了Java Serializable和Parcelable詳解,并附實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-09-09java實(shí)現(xiàn)航空用戶管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)航空用戶管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-07-07Springcloud RestTemplate服務(wù)調(diào)用代碼實(shí)例
這篇文章主要介紹了Springcloud RestTemplate服務(wù)調(diào)用代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08