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(Listerrors){
returncreateRestult(NotOK,null,null,null,errors);
}
//TODO构建错误与正确方法
publicstaticBaseResultcreateRestult(Stringresult,Objectdata,Stringsuccess,Cursorcursor,Listerrors){
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统一修改返回值的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。