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

(0)

相关推荐

  • java ThreadPool线程池的使用,线程池工具类用法说明

    实际上java已经提供线程池的实现 ExecutorService. 为了更方便的使用和管理.这里提供一个线程池工具类,方便大家的使用. 直接看看代码: 使用 public static void main(String[] args) { //实例化一个固定数目的线程池.具体参考类的构造方法 ThreadPool threadPool=new ThreadPool(ThreadPool.FixedThread,5); //线程池执行线程 threadPool.execute(new Runna

  • Java fastdfs客户端实现上传下载文件

    一.项目结构 二.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.

  • java jackson 将对象转json时,忽略子对象的某个属性操作

    我就废话不多说了,大家还是直接看代码吧~ //父对象 public class user implements java.io.Serializable { @JsonIgnoreProperties(value={"addressId"})//在解析成json时,忽略子属性的addressId字段 private Address address; private String username; //......... } //子对象 public class Address imp

  • java中下拉框select和单选按钮的回显操作

    前提: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 1.下拉框select <select name="departmentId" id="departmentId"> <option value="0">请选择部门</option> <c:forEach items=&

  • Java后台Controller实现文件下载操作

    代码 参数: 1.filePath:文件的绝对路径(d:\download\a.xlsx) 2.fileName(a.xlsx) 3.编码格式(GBK) 4.response.request不介绍了,从控制器传入的http对象 代码片. //控制器 @RequestMapping(UrlConstants.BLACKLIST_TESTDOWNLOAD) public void downLoad(String filePath, HttpServletResponse response, Http

  • 在java中判断两个浮点型(float)数据是否相等的案例

    示例代码: public static void main(String[] args) { float a = 10.222222225f; float b = 10.222222229f; System.out.println("使用==判断是否相等:" + (a == b));// 超出精度范围 System.out.println("使用Math.abs()判断是否相等:" + (Math.abs(a - b) >= 0)); System.out.p

  • Java中s.charAt(index)用于提取字符串s中的特定字符操作

    charAt(int index)方法是一个能够用来检索特定索引下的字符的String实例的方法. charAt()方法返回指定索引位置的char值.索引范围为0~length()-1. 如: str.charAt(0)检索str中的第一个字符,str.charAt(str.length()-1)检索最后一个字符. 警告:在字符串s中越界访问字符是一种常见的程序设计错误.为避免此类错误要确保使用的下标不会超过s.length()-1. public class hash { public sta

  • java中long(Long)与int(Integer)之间的转换方式

    我就废话不多说了,大家还是直接看代码吧~ public static void main(String[] args) { // 1.将long型转化为int型,其中int.long是基础类型 long a = 10; int b = (int) a; System.out.println("1.将long型转化为int型:" + b); // 2.将int型转化为long型,其中int.long都是基础类型 int a1 = 10; long b1 = a1; System.out.

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

    使用spring cloud有时候我们给客户端返回内容的时候,往往需要添加一些额外的东西.比如加密,多添加一个返回值等等. 当然可以在方法里面处理,但如果方法很多,需要统一处理的,就很不方便了,这时候可以通过zuulGateway的filter来统一处理. 直接看代码,很简单: import java.io.InputStream; import java.nio.charset.Charset; import org.springframework.cloud.netflix.zuul.fil

  • SpringMVC修改返回值类型后的消息转换器处理方式

    目录 问题案例 为什么? 了解问题原因及分析 解决方法 结语 o(╯□╰)o这标题看起来有点奇怪,所以先以一个小小的案例来说明一下本文要描述和解决的问题 问题案例 假设有一个Controller方法如下 @RequestMapping(value = "test") @ResponseBody public Object test() { Map<String,String> param = new HashMap<>(); param.put("na

  • .NetCore Web Api 利用ActionFilterAttribute统一接口返回值格式及问题解析

    .Net Core 同 Asp.Net MVC一样有几种过滤器,这里不再赘述每个过滤器的执行顺序与作用. 在实际项目开发过程中,统一API返回值格式对前端或第三方调用将是非常必要的,在.NetCore中我们可以通过ActionFilterAttribute来进行统一返回值的封装. 在封装之前我们需要考虑下面几个问题: 1,需要对哪些结果进行封装 我目前的做法是,只对ObjectResult进行封装,其他的类型:FileResult,ContentResult,EmptyResult,Redire

  • go 协程返回值处理操作

    我就废话不多说了,大家还是直接看代码吧~ package main import "fmt" import "sync" var ch = make(chan int) func do(lock *sync.Mutex, ct *int) { lock.Lock() *ct++ lock.Unlock() ch <- 1 } func main() { fmt.Println("hello thread") var ct = 0 lock

  • Idea 快速生成方法返回值的操作

    生成前: public static void main(String[] args) { new HashMap<String,Object>(); } 生成方法 生成后 public static void main(String[] args) { HashMap<String, Object> stringObjectHashMap = new HashMap<>(); } 快捷键: Ctrl + Alt + v 补充:idea 自动生成返回值以及返回值的类型

  • Spring MVC Controller返回值及异常的统一处理方法

    旧的设计方案 开发api的时候,需要先定义好接口的数据响应结果.如下是一个很简单直接的Controller实现方法及响应结果定义. @RestController @RequestMapping("/users") public class UserController { @Inject private UserService userService; @GetRequest("/{userId:\\d+}") public ResponseBean signin

  • SpringBoot全局Controller返回值格式统一

    目录 一.返回值格式统一 1.返回值介绍 2.基础类功能 3.基础实现 二.附录说明 一.返回值格式统一 1.返回值介绍 在使用controller对外提供服务的时候,很多时候都需要统一返回值格式,例如 { "status": true, "message": null, "code": "200", "data": { "name": "json", "d

  • 关于springboot的接口返回值统一标准格式

    目录 一.目标 二.为什么要对springboot的接口返回值统一标准格式? 第一种格式:response为String 第二种格式:response为Objct 第三种格式:response为void 第四种格式:response为异常 三.定义response的标准格式 四.初级程序员对response代码封装 步骤1:把标准格式转换为代码 步骤2:把状态码存在枚举类里面 步骤3:加一个体验类 五.高级程序员对response代码封装 步骤1:采用ResponseBodyAdvice技术来实

  • 详解SpringBoot如何统一后端返回格式

    目录 为什么要对SpringBoot返回统一的标准格式 第一种:返回 String 第二种:返回自定义对象 第三种:接口异常 定义返回标准格式 高级实现方式 接口异常问题 SpringBoot为什么需要全局异常处理器 体验效果 全局异常接入返回的标准格式 今天我们来聊一聊在基于SpringBoot前后端分离开发模式下,如何友好的返回统一的标准格式以及如何优雅的处理全局异常. 首先我们来看看为什么要返回统一的标准格式? 为什么要对SpringBoot返回统一的标准格式 在默认情况下,SpringB

  • 解析springboot包装controller返回值问题

    1.springboot项目统一包装返回值,通常返回结果包含code.message.data,结构如下 import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class ResponseResult<T> { private int code; private Strin

随机推荐