使用spring cloud有时候我们给客户端返回内容的时候,往往需要添加一些额外的东西。比如加密,多添加一个返回值等等。 当然可以在方法里面处理,但如果方法很多,需要统一处理的,
使用spring cloud有时候我们给客户端返回内容的时候,往往需要添加一些额外的东西。比如加密,多添加一个返回值等等。
当然可以在方法里面处理,但如果方法很多,需要统一处理的,就很不方便了,这时候可以通过zuulGateway的filter来统一处理。
直接看代码,很简单:
import java.io.InputStream; import java.nio.charset.Charset; import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants; import org.springframework.util.StreamUtils; import org.springframework.util.StringUtils; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.poly.zuul.common.Constants; import com.poly.zuul.enums.ServiceId; import com.poly.zuul.utils.AESJSEncryptUtils; import com.poly.zuul.utils.RsaEncryptUtil; /** * 返回值输出过滤器,这里用来处理返回值 * * @Title: ResponseFilter * @Description: * @author kokJuis * @date 上午9:52:42 */ public class ResponseFilter extends ZuulFilter { @Override public Object run() { RequestContext context = RequestContext.getCurrentContext(); try { // 获取返回值内容,加以处理 InputStream stream = context.getResponseDataStream(); String body = StreamUtils.copyToString(stream, Charset.forName("UTF-8")); String returnStr = ""; //你的处理逻辑,加密,添加新的返回值等等..... // 内容重新写入 context.setResponseBody(returnStr); } catch (Exception e) { e.printStackTrace(); } return null; } @Override public boolean shouldFilter() { RequestContext ctx = RequestContext.getCurrentContext(); String requestURI = String.valueOf(ctx.get("requestURI")); if (requestURI.contains(Constants.alipay)) { //不需要处理的URL请求,返回false return false; } return true; } @Override public int filterOrder() { return FilterConstants.SEND_RESPONSE_FILTER_ORDER - 3; } @Override public String filterType() { return FilterConstants.POST_TYPE;// 在请求被处理之后,会进入该过滤器 } }
然后在@Configuration里面注册一下这个filter就可以了
@Bean public ResponseFilter responseFilter() { return new ResponseFilter(); }
补充知识:springCloud 服务提供者应返回的统一的数据格式
我就废话不多说了,大家还是直接看代码吧~
package com.zledu.commonentity.entity; import lombok.AllArgsConstructor; import lombok.Data; import java.io.Serializable; import java.util.List; /** * @Author: husToy.Wang * @Date: 2019/6/27 8:55 * @Version 1.0 * @date 2019-06-27 08:58 * @author wangzhilei */ @Data public class BaseResult implements Serializable { private static final String OK = "OK"; private static final String NotOK = "notOk" ; private static final String SUCCESS = "操作成功"; private String result; private Object data; private String success; private Cursor cursor; private List<Error> errors; // TODO 返回无参ok public static BaseResult ok(){ return createRestult(OK, null, SUCCESS,null,null ) ; } // TODO 返回带success 的 ok public static BaseResult ok(String success){ return createRestult(OK, null, success, null, null); } // TODO 返回带 data 的ok public static BaseResult ok(Object data){ return createRestult(OK, data, SUCCESS, null, null); } // 返回带分页的数据 public static BaseResult ok(Object data, Cursor cursor) { return createRestult(OK, data, SUCCESS, cursor, null); } // TODO 返回错误数据 public static BaseResult notOk(List<BaseResult.Error> errors){ return createRestult(NotOK, null, null, null, errors); } // TODO 构建错误与正确方法 public static BaseResult createRestult(String result, Object data,String success, Cursor cursor, List<BaseResult.Error> errors){ BaseResult baseResult = new BaseResult(); baseResult.setResult(result); baseResult.setData(data); baseResult.setSuccess(success); baseResult.setCursor(cursor); baseResult.setErrors(errors); return baseResult; } @Data @AllArgsConstructor public static class Cursor { private int total; private int offset; private int limit; } @Data @AllArgsConstructor public static class Error{ private String field; private String message; } }
以上这篇zuulGateway 通过filter统一修改返回值的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持易盾网络。