zuulGateway 通過filter統(tǒng)一修改返回值的操作
使用spring cloud有時(shí)候我們給客戶端返回內(nèi)容的時(shí)候,往往需要添加一些額外的東西。比如加密,多添加一個(gè)返回值等等。
當(dāng)然可以在方法里面處理,但如果方法很多,需要統(tǒng)一處理的,就很不方便了,這時(shí)候可以通過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請(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)入該過濾器 } }
然后在@Configuration里面注冊一下這個(gè)filter就可以了
@Bean public ResponseFilter responseFilter() { return new ResponseFilter(); }
補(bǔ)充知識(shí):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 返回錯(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 通過filter統(tǒng)一修改返回值的操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- java ThreadPool線程池的使用,線程池工具類用法說明
- 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中transient關(guān)鍵字的詳細(xì)總結(jié)
本文要介紹的是Java中的transient關(guān)鍵字,transient是短暫的意思。對(duì)于transient 修飾的成員變量,在類的實(shí)例對(duì)象的序列化處理過程中會(huì)被忽略,感興趣的朋友可以參考閱讀2023-04-04面試官:Java中new Object()到底占用幾個(gè)字節(jié)
這篇文章主要介紹了面試官:Java中new Object()到底占用幾個(gè)字節(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02Spring框架接入單機(jī)Redis兩種實(shí)現(xiàn)方式解析
這篇文章主要介紹了Spring框架接入單機(jī)Redis兩種實(shí)現(xiàn)方式解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Java 進(jìn)程執(zhí)行外部程序造成阻塞的一種原因
前一陣子在研究文檔展示時(shí)使用了java進(jìn)程直接調(diào)用外部程序,其中遇到一個(gè)問題花了好長時(shí)間才解決,這個(gè)問題就是外部程序直接執(zhí)行沒什么問題,但是當(dāng)使用Java進(jìn)程執(zhí)行時(shí)外部程序就阻塞在那兒不動(dòng)了。而且這個(gè)外部程序在處理某些文件時(shí)使用Java進(jìn)程執(zhí)行是沒問題的2014-03-03解決springboot啟動(dòng)Logback報(bào)錯(cuò)ERROR in ch.qos.logback.cla
這篇文章主要介紹了解決springboot啟動(dòng)Logback報(bào)錯(cuò)ERROR in ch.qos.logback.classic.joran.action.ContextNameAction - Failed to rena問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04Mybatis詳解動(dòng)態(tài)SQL以及單表多表查詢的應(yīng)用
MyBatis的動(dòng)態(tài)SQL是基于OGNL表達(dá)式的,它可以幫助我們方便的在SQL語句中實(shí)現(xiàn)某些邏輯,下面這篇文章主要給大家介紹了關(guān)于Mybatis超級(jí)強(qiáng)大的動(dòng)態(tài)SQL語句的相關(guān)資料,需要的朋友可以參考下2022-06-06SpringBoot整合Minio實(shí)現(xiàn)圖片上傳功能
Minio是一款開源的對(duì)象存儲(chǔ)服務(wù)器,它提供了一個(gè)云原生的、高性能的、易于擴(kuò)展的文件系統(tǒng)接口,用于存儲(chǔ)和檢索任意大小的數(shù)據(jù),本文將給大家介紹SpringBoot整合Minio實(shí)現(xiàn)圖片上傳功能,需要的朋友可以參考下2024-08-08