zuulGateway 通過(guò)filter統(tǒng)一修改返回值的操作
使用spring cloud有時(shí)候我們給客戶端返回內(nèi)容的時(shí)候,往往需要添加一些額外的東西。比如加密,多添加一個(gè)返回值等等。
當(dāng)然可以在方法里面處理,但如果方法很多,需要統(tǒng)一處理的,就很不方便了,這時(shí)候可以通過(guò)zuulGateway的filter來(lái)統(tǒng)一處理。
直接看代碼,很簡(jiǎn)單:
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;
/**
* 返回值輸出過(guò)濾器,這里用來(lái)處理返回值
*
* @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)容重新寫(xiě)入
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請(qǐng)求,返回false
return false;
}
return true;
}
@Override
public int filterOrder()
{
return FilterConstants.SEND_RESPONSE_FILTER_ORDER - 3;
}
@Override
public String filterType()
{
return FilterConstants.POST_TYPE;// 在請(qǐng)求被處理之后,會(huì)進(jìn)入該過(guò)濾器
}
}
然后在@Configuration里面注冊(cè)一下這個(gè)filter就可以了
@Bean
public ResponseFilter responseFilter()
{
return new ResponseFilter();
}
補(bǔ)充知識(shí):springCloud 服務(wù)提供者應(yīng)返回的統(tǒng)一的數(shù)據(jù)格式
我就廢話不多說(shuō)了,大家還是直接看代碼吧~
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);
}
// 返回帶分頁(yè)的數(shù)據(jù)
public static BaseResult ok(Object data, Cursor cursor) {
return createRestult(OK, data, SUCCESS, cursor, null);
}
// TODO 返回錯(cuò)誤數(shù)據(jù)
public static BaseResult notOk(List<BaseResult.Error> errors){
return createRestult(NotOK, null, null, null, errors);
}
// TODO 構(gòu)建錯(cuò)誤與正確方法
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 通過(guò)filter統(tǒng)一修改返回值的操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- java ThreadPool線程池的使用,線程池工具類用法說(shuō)明
- Java fastdfs客戶端實(shí)現(xiàn)上傳下載文件
- java jackson 將對(duì)象轉(zhuǎn)json時(shí),忽略子對(duì)象的某個(gè)屬性操作
- Java后臺(tái)Controller實(shí)現(xiàn)文件下載操作
- java中下拉框select和單選按鈕的回顯操作
- java中l(wèi)ong(Long)與int(Integer)之間的轉(zhuǎn)換方式
- 在java中判斷兩個(gè)浮點(diǎn)型(float)數(shù)據(jù)是否相等的案例
- Java中s.charAt(index)用于提取字符串s中的特定字符操作
相關(guān)文章
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(57)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-08-08
Spring File Storage文件的對(duì)象存儲(chǔ)框架基本使用小結(jié)
在開(kāi)發(fā)過(guò)程當(dāng)中,會(huì)使用到存文檔、圖片、視頻、音頻等等,這些都會(huì)涉及存儲(chǔ)的問(wèn)題,文件可以直接存服務(wù)器,但需要考慮帶寬和存儲(chǔ)空間,另外一種方式就是使用云存儲(chǔ),這篇文章主要介紹了Spring File Storage文件的對(duì)象存儲(chǔ)框架基本使用小結(jié),需要的朋友可以參考下2024-08-08
java 讀取excel文件轉(zhuǎn)換成json格式的實(shí)例代碼
這篇文章主要介紹了 java 讀取excel文件轉(zhuǎn)換成json格式的實(shí)例代碼,需要的朋友可以參考下2018-04-04
Java ThreadLocal的設(shè)計(jì)理念與作用
這篇文章主要介紹了Java ThreadLocal的設(shè)計(jì)理念與作用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
Java 對(duì) Cookie增刪改查的實(shí)現(xiàn)示例
這篇文章主要介紹了Java 對(duì) Cookie增刪改查的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
詳解java CountDownLatch和CyclicBarrier在內(nèi)部實(shí)現(xiàn)和場(chǎng)景上的區(qū)別
這篇文章主要介紹了詳解java CountDownLatch和CyclicBarrier在內(nèi)部實(shí)現(xiàn)和場(chǎng)景上的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
Java實(shí)現(xiàn)List去重的五種方法詳解
這篇文章主要為大家詳細(xì)介紹了Java中List去重的5種方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)和參考價(jià)值,需要的小伙伴可以了解一下2022-10-10

