當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
SpringCloud Zuul(七)之POST Filter
生活随笔
收集整理的這篇文章主要介紹了
SpringCloud Zuul(七)之POST Filter
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、POST Filter
后置過濾器一般使用來轉(zhuǎn)換響應(yīng)數(shù)據(jù)的格式,截取請求響應(yīng)數(shù)據(jù)進(jìn)行流量錄制等操作。
Zuul已定義的后置過濾器SendResponseFilter,將代理請求的響應(yīng)寫入當(dāng)前響應(yīng)。
?
二、自定義后置過濾器
本文自定義后置過濾器用來截取響應(yīng)體的快照文本發(fā)送到kafka存儲。
?
三、實(shí)現(xiàn)代碼
@Component @Slf4j public class PostFilter extends ZuulFilter {//按類型對過濾器進(jìn)行分類。Zuul中的標(biāo)準(zhǔn)類型是"pre"用于預(yù)路由篩選,"route"用于路由到原點(diǎn),"post"用于后路由篩選,"error"用于錯誤處理。//我們還支持靜態(tài)響應(yīng)的"static"類型請參閱StaticResponseFilter。可以通過調(diào)用FilterProcessor.runFilters(type)//后置過濾器必須返回post@Overridepublic String filterType() {return FilterConstants.POST_TYPE;}//必須為過濾器定義filterOrder。如果優(yōu)先級對篩選器不重要,則過濾器可能具有相同的過濾器順序//過濾器順序不需要是連續(xù)的@Overridepublic int filterOrder() {return FilterConstants.SEND_RESPONSE_FILTER_ORDER - 10;}//默認(rèn)情況下,zuulfilter是靜態(tài)的;它們不攜帶狀態(tài)。這可以通過將isStaticFilter屬性重寫為false來重寫@Overridepublic boolean isStaticFilter() {return super.isStaticFilter();}//要禁用此篩選器的Archaius屬性的名稱。默認(rèn)情況下,它是zuul.[classname].[filtertype].disable@Overridepublic String disablePropertyName() {return super.disablePropertyName();}//如果為true,則過濾器已被archaius禁用,不會運(yùn)行@Overridepublic boolean isFilterDisabled() {return super.isFilterDisabled();}//此方法返回的"true"表示應(yīng)該調(diào)用run方法//如果應(yīng)該調(diào)用run方法,則返回true。false不會調(diào)用run方法@Overridepublic boolean shouldFilter() {RequestContext context = RequestContext.getCurrentContext();return context.getThrowable() == null&& (!context.getZuulResponseHeaders().isEmpty()|| context.getResponseDataStream() != null|| context.getResponseBody() != null);}//如果shouldFilter方法為true,則將調(diào)用此方法。這種方法是ZuulFilter的核心方法//返回一些可以返回的任意工件。當(dāng)前的實(shí)現(xiàn)忽略了它。//如果在執(zhí)行期間發(fā)生錯誤,則引發(fā)ZuulException@Overridepublic Object run() throws ZuulException {RequestContext context = RequestContext.getCurrentContext();InputStream in = null;try {String responseBody = context.getResponseBody();if (responseBody == null) {in = context.getResponseDataStream();ByteArrayOutputStream output = new ByteArrayOutputStream();IOUtils.copy(in, output);byte[] bodyBytes = output.toByteArray();//回填已讀的流context.setResponseDataStream(new ByteArrayInputStream(bodyBytes));in = new ByteArrayInputStream(bodyBytes);if (context.getResponseGZipped()) {in = new GZIPInputStream(in);}HttpServletResponse servletResponse = context.getResponse();String endcoding = servletResponse.getCharacterEncoding();if (endcoding == null) {endcoding = "UTF-8";}responseBody = StreamUtils.copyToString(in, Charset.forName(endcoding));}//存儲響應(yīng)數(shù)據(jù)KafkaUtils.sendResponseDataAsync(context.getRequest().getRequestURI(), responseBody);} catch (Exception e) {log.error("post filter error",e);}finally {if(in!= null){try {in.close();} catch (IOException e) {log.warn("post filter close io error",e);}}}return null;}}?
總結(jié)
以上是生活随笔為你收集整理的SpringCloud Zuul(七)之POST Filter的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 易路代理IP软件是什么?指纹防关联浏览器
- 下一篇: gradle idea java ssm