zuulGateway 通过filter统一修改返回值的操作

 更新时间:2020年10月09日 10:13:28   作者:Gogym  
这篇文章主要介绍了zuulGateway 通过filter统一修改返回值的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

使用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统一修改返回值的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java自动生成编号的方法步骤

    Java自动生成编号的方法步骤

    在新增数据时,往往需要自动生成编号,本文主要介绍了Java自动生成编号的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Java中transient关键字的详细总结

    Java中transient关键字的详细总结

    本文要介绍的是Java中的transient关键字,transient是短暂的意思。对于transient 修饰的成员变量,在类的实例对象的序列化处理过程中会被忽略,感兴趣的朋友可以参考阅读
    2023-04-04
  • 面试官:Java中new Object()到底占用几个字节

    面试官:Java中new Object()到底占用几个字节

    这篇文章主要介绍了面试官:Java中new Object()到底占用几个字节,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 一文详解jvm中的引用类型

    一文详解jvm中的引用类型

    在Java中对象以引用来指向JVM的内存区块,这里我们总结了强引用、软引用、弱引用和假象引用(幽灵引用),下面这篇文章主要给大家介绍了关于jvm中引用类型的相关资料,需要的朋友可以参考下
    2024-04-04
  • Spring框架接入单机Redis两种实现方式解析

    Spring框架接入单机Redis两种实现方式解析

    这篇文章主要介绍了Spring框架接入单机Redis两种实现方式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java设计模式中的单例模式解析

    Java设计模式中的单例模式解析

    这篇文章主要介绍了Java设计模式中的单例模式解析,单例模式确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,需要的朋友可以参考下
    2023-11-11
  • Java 进程执行外部程序造成阻塞的一种原因

    Java 进程执行外部程序造成阻塞的一种原因

    前一阵子在研究文档展示时使用了java进程直接调用外部程序,其中遇到一个问题花了好长时间才解决,这个问题就是外部程序直接执行没什么问题,但是当使用Java进程执行时外部程序就阻塞在那儿不动了。而且这个外部程序在处理某些文件时使用Java进程执行是没问题的
    2014-03-03
  • 解决springboot启动Logback报错ERROR in ch.qos.logback.classic.joran.action.ContextNameAction - Failed to rena

    解决springboot启动Logback报错ERROR in ch.qos.logback.cla

    这篇文章主要介绍了解决springboot启动Logback报错ERROR in ch.qos.logback.classic.joran.action.ContextNameAction - Failed to rena问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Mybatis详解动态SQL以及单表多表查询的应用

    Mybatis详解动态SQL以及单表多表查询的应用

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,下面这篇文章主要给大家介绍了关于Mybatis超级强大的动态SQL语句的相关资料,需要的朋友可以参考下
    2022-06-06
  • SpringBoot整合Minio实现图片上传功能

    SpringBoot整合Minio实现图片上传功能

    Minio是一款开源的对象存储服务器,它提供了一个云原生的、高性能的、易于扩展的文件系统接口,用于存储和检索任意大小的数据,本文将给大家介绍SpringBoot整合Minio实现图片上传功能,需要的朋友可以参考下
    2024-08-08

最新评论