zuulGateway 通过filter统一修改返回值的操作
使用springcloud有时候我们给客户端返回内容的时候,往往需要添加一些额外的东西。比如加密,多添加一个返回值等等。
当然可以在方法里面处理,但如果方法很多,需要统一处理的,就很不方便了,这时候可以通过zuulGateway的filter来统一处理。
直接看代码,很简单:
importjava.io.InputStream; importjava.nio.charset.Charset; importorg.springframework.cloud.netflix.zuul.filters.support.FilterConstants; importorg.springframework.util.StreamUtils; importorg.springframework.util.StringUtils; importcom.netflix.zuul.ZuulFilter; importcom.netflix.zuul.context.RequestContext; importcom.poly.zuul.common.Constants; importcom.poly.zuul.enums.ServiceId; importcom.poly.zuul.utils.AESJSEncryptUtils; importcom.poly.zuul.utils.RsaEncryptUtil; /** *返回值输出过滤器,这里用来处理返回值 * *@Title:ResponseFilter *@Description: *@authorkokJuis *@date上午9:52:42 */ publicclassResponseFilterextendsZuulFilter { @Override publicObjectrun() { RequestContextcontext=RequestContext.getCurrentContext(); try { //获取返回值内容,加以处理 InputStreamstream=context.getResponseDataStream(); Stringbody=StreamUtils.copyToString(stream,Charset.forName("UTF-8")); StringreturnStr=""; //你的处理逻辑,加密,添加新的返回值等等..... //内容重新写入 context.setResponseBody(returnStr); } catch(Exceptione) { e.printStackTrace(); } returnnull; } @Override publicbooleanshouldFilter() { RequestContextctx=RequestContext.getCurrentContext(); StringrequestURI=String.valueOf(ctx.get("requestURI")); if(requestURI.contains(Constants.alipay)) { //不需要处理的URL请求,返回false returnfalse; } returntrue; } @Override publicintfilterOrder() { returnFilterConstants.SEND_RESPONSE_FILTER_ORDER-3; } @Override publicStringfilterType() { returnFilterConstants.POST_TYPE;//在请求被处理之后,会进入该过滤器 } }
然后在@Configuration里面注册一下这个filter就可以了
@Bean publicResponseFilterresponseFilter() { returnnewResponseFilter(); }
补充知识:springCloud服务提供者应返回的统一的数据格式
我就废话不多说了,大家还是直接看代码吧~
packagecom.zledu.commonentity.entity; importlombok.AllArgsConstructor; importlombok.Data; importjava.io.Serializable; importjava.util.List; /** *@Author:husToy.Wang *@Date:2019/6/278:55 *@Version1.0 *@date2019-06-2708:58 *@authorwangzhilei */ @Data publicclassBaseResultimplementsSerializable{ privatestaticfinalStringOK="OK"; privatestaticfinalStringNotOK="notOk"; privatestaticfinalStringSUCCESS="操作成功"; privateStringresult; privateObjectdata; privateStringsuccess; privateCursorcursor; privateListerrors; //TODO返回无参ok publicstaticBaseResultok(){ returncreateRestult(OK,null,SUCCESS,null,null); } //TODO返回带success的ok publicstaticBaseResultok(Stringsuccess){ returncreateRestult(OK,null,success,null,null); } //TODO返回带data的ok publicstaticBaseResultok(Objectdata){ returncreateRestult(OK,data,SUCCESS,null,null); } //返回带分页的数据 publicstaticBaseResultok(Objectdata,Cursorcursor){ returncreateRestult(OK,data,SUCCESS,cursor,null); } //TODO返回错误数据 publicstaticBaseResultnotOk(List errors){ returncreateRestult(NotOK,null,null,null,errors); } //TODO构建错误与正确方法 publicstaticBaseResultcreateRestult(Stringresult,Objectdata,Stringsuccess,Cursorcursor,List errors){ BaseResultbaseResult=newBaseResult(); baseResult.setResult(result); baseResult.setData(data); baseResult.setSuccess(success); baseResult.setCursor(cursor); baseResult.setErrors(errors); returnbaseResult; } @Data @AllArgsConstructor publicstaticclassCursor{ privateinttotal; privateintoffset; privateintlimit; } @Data @AllArgsConstructor publicstaticclassError{ privateStringfield; privateStringmessage; } }
以上这篇zuulGateway通过filter统一修改返回值的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。