zuulGateway 通過filter統(tǒng)一修改返回值的操作
使用spring cloud有時候我們給客戶端返回內(nèi)容的時候,往往需要添加一些額外的東西。比如加密,多添加一個返回值等等。
當(dāng)然可以在方法里面處理,但如果方法很多,需要統(tǒng)一處理的,就很不方便了,這時候可以通過zuulGateway的filter來統(tǒng)一處理。
直接看代碼,很簡單:
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
{
// 獲取返回值內(nèi)容,加以處理
InputStream stream = context.getResponseDataStream();
String body = StreamUtils.copyToString(stream, Charset.forName("UTF-8"));
String returnStr = "";
//你的處理邏輯,加密,添加新的返回值等等.....
// 內(nèi)容重新寫入
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 服務(wù)提供者應(yīng)返回的統(tǒng)一的數(shù)據(jù)格式
我就廢話不多說了,大家還是直接看代碼吧~
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 返回?zé)o參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);
}
// 返回帶分頁的數(shù)據(jù)
public static BaseResult ok(Object data, Cursor cursor) {
return createRestult(OK, data, SUCCESS, cursor, null);
}
// TODO 返回錯誤數(shù)據(jù)
public static BaseResult notOk(List<BaseResult.Error> errors){
return createRestult(NotOK, null, null, null, errors);
}
// TODO 構(gòu)建錯誤與正確方法
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統(tǒng)一修改返回值的操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中transient關(guān)鍵字的詳細總結(jié)
本文要介紹的是Java中的transient關(guān)鍵字,transient是短暫的意思。對于transient 修飾的成員變量,在類的實例對象的序列化處理過程中會被忽略,感興趣的朋友可以參考閱讀2023-04-04
面試官:Java中new Object()到底占用幾個字節(jié)
這篇文章主要介紹了面試官:Java中new Object()到底占用幾個字節(jié),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02
Spring框架接入單機Redis兩種實現(xiàn)方式解析
這篇文章主要介紹了Spring框架接入單機Redis兩種實現(xiàn)方式解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09
解決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詳解動態(tài)SQL以及單表多表查詢的應(yīng)用
MyBatis的動態(tài)SQL是基于OGNL表達式的,它可以幫助我們方便的在SQL語句中實現(xiàn)某些邏輯,下面這篇文章主要給大家介紹了關(guān)于Mybatis超級強大的動態(tài)SQL語句的相關(guān)資料,需要的朋友可以參考下2022-06-06
SpringBoot整合Minio實現(xiàn)圖片上傳功能
Minio是一款開源的對象存儲服務(wù)器,它提供了一個云原生的、高性能的、易于擴展的文件系統(tǒng)接口,用于存儲和檢索任意大小的數(shù)據(jù),本文將給大家介紹SpringBoot整合Minio實現(xiàn)圖片上傳功能,需要的朋友可以參考下2024-08-08

