zuul網關過濾器實現對GET請求的參數替換


由於需求,需要在網關層做一些參數的替換,特此記錄一下,以下方式只針對GET請求

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * 過濾參數
 *
 * @author 
 *         2019-5-17 10:01
 */
@Component
public class ParametersFilter extends ZuulFilter {

    private static final Logger LOGGER = LoggerFactory.getLogger(ParametersFilter.class);

    private static final String KEY = "PARAMETER_FILTER_KEY";

    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

    @Override
    public int filterOrder() {
        return 9;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {

        // 獲取到request
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();

        try {
            //是否攔截
           // todo

            //防止錯誤重試多次轉換
            Boolean isConver = (Boolean) request.getAttribute(KEY);
            if (isConver != null && isConver) {
                return null;
            }

            String method = request.getMethod();
            LOGGER.info("將對請求進行替換, 方法為{}, url = {}", method, request.getRequestURI());

            // get方法
            if ("GET".equals(method.toUpperCase())) {
                //獲取參數
                Map<String, String[]> parameterMap = request.getParameterMap();
                if (parameterMap == null) {
                    return null;
                }
                //替換,業務邏輯
                Map<String, List<String>> requestQueryParams = ctx.getRequestQueryParams();
                if (requestQueryParams == null) {
                    requestQueryParams = new HashMap<>(parameterMap.size() * 2);
                }
                for (String key : parameterMap.keySet()) {
                    String[] values = parameterMap.get(key);
                    List<String> valueList = new LinkedList<>();
                    for (String value : values) {
                        valueList.add(change(value));
                    }
                    requestQueryParams.put(key, valueList);
                }
                //重新寫入參數
                ctx.setRequestQueryParams(requestQueryParams);
                LOGGER.info("轉譯完成, url = {}", request.getRequestURI());
            }
        } catch (Exception e) {
            LOGGER.error("參數替換異常:{}", e);
        } finally {
            request.setAttribute(KEY, true);
        }

        return null;
    }

    /**
     * 替換
     *
     * @param data 數據
     * @return 轉譯后數據
     */
    private String change(String data) {
        // todo
        return data;
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM