1. 程式人生 > >zuulGateway 通過filter統一修改返回值

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();
    }