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

}

 

posted @ 2019-08-02 14:47  Grace&Gemin  阅读(1860)  评论(0编辑  收藏  举报