zoukankan      html  css  js  c++  java
  • 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;
        }
    
    }
    
  • 相关阅读:
    ArchLinux and LXDE and LXDM
    如何改变X:\Users\XXX的用户名称
    Windows 7 支持4GB以上内存破解工具下载
    Linux & Vim Command Wallpaper
    The easy way to execute sudo command in Python using subprocess.Popen
    C# DateTime 精确到秒/截断毫秒部分
    制约程序员"钱途"的两大最关键因素
    Oracle基本操作
    字符串处理【Delphi版】
    java学习路线的经验之谈
  • 原文地址:https://www.cnblogs.com/hdllhd/p/11284306.html
Copyright © 2011-2022 走看看