zuulGateway 通過filter統一修改返回值
阿新 • • 發佈:2019-01-07
使用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();
}