文档章节

zuul修改request query param

go4it
 go4it
发布于 2017/05/24 23:19
字数 326
阅读 45
收藏 0

##SimpleHostRoutingFilter

@Override
	public Object run() {
		RequestContext context = RequestContext.getCurrentContext();
		HttpServletRequest request = context.getRequest();
		MultiValueMap<String, String> headers = this.helper
				.buildZuulRequestHeaders(request);
		MultiValueMap<String, String> params = this.helper
				.buildZuulRequestQueryParams(request);
		String verb = getVerb(request);
		InputStream requestEntity = getRequestBody(request);
		if (request.getContentLength() < 0) {
			context.setChunkedRequestBody();
		}

		String uri = this.helper.buildZuulRequestURI(request);
		this.helper.addIgnoredHeaders();

		try {
			HttpResponse response = forward(this.httpClient, verb, uri, request, headers,
					params, requestEntity);
			setResponse(response);
		}
		catch (Exception ex) {
			context.set(ERROR_STATUS_CODE, HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
			context.set("error.exception", ex);
		}
		return null;
	}

重点关注

MultiValueMap<String, String> params = this.helper
				.buildZuulRequestQueryParams(request);

在ProxyRequestHelper类里头

public MultiValueMap<String, String> buildZuulRequestQueryParams(
			HttpServletRequest request) {
		Map<String, List<String>> map = HTTPRequestUtils.getInstance().getQueryParams();
		MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
		if (map == null) {
			return params;
		}
		for (String key : map.keySet()) {
			for (String value : map.get(key)) {
				params.add(key, value);
			}
		}
		return params;
	}

再看com/netflix/zuul/util/HTTPRequestUtils.java

public Map<String, List<String>> getQueryParams() {

        Map<String, List<String>> qp = RequestContext.getCurrentContext().getRequestQueryParams();
        if (qp != null) return qp;

        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();

        qp = new HashMap<String, List<String>>();

        if (request.getQueryString() == null) return null;
        StringTokenizer st = new StringTokenizer(request.getQueryString(), "&");
        int i;

        while (st.hasMoreTokens()) {
            String s = st.nextToken();
            i = s.indexOf("=");
            if (i > 0 && s.length() >= i + 1) {
                String name = s.substring(0, i);
                String value = s.substring(i + 1);

                try {
                    name = URLDecoder.decode(name, "UTF-8");
                } catch (Exception e) {
                }
                try {
                    value = URLDecoder.decode(value, "UTF-8");
                } catch (Exception e) {
                }

                List<String> valueList = qp.get(name);
                if (valueList == null) {
                    valueList = new LinkedList<String>();
                    qp.put(name, valueList);
                }

                valueList.add(value);
            }
            else if (i == -1)
            {
                String name=s;
                String value="";
                try {
                    name = URLDecoder.decode(name, "UTF-8");
                } catch (Exception e) {
                }
               
                List<String> valueList = qp.get(name);
                if (valueList == null) {
                    valueList = new LinkedList<String>();
                    qp.put(name, valueList);
                }

                valueList.add(value);
                
            }
        }

        RequestContext.getCurrentContext().setRequestQueryParams(qp);
        return qp;
    }

这里优先取了RequestContext.getCurrentContext().getRequestQueryParams(); 因此,对于url路由的服务来说,可以修改context的queryParam来达到修改请求参数的目的。


想获取最新内容,请关注微信公众号

输入图片说明

© 著作权归作者所有

go4it
粉丝 83
博文 981
码字总数 948756
作品 0
深圳
私信 提问
nginx报错“No input file specified”

最近买了台海外的vps做vpn,使用一键lnmp后改了一下nginx的配置文件,测试php页面发现返回“No input file specified”,查站点日志报错如下状态码是404,提示找不到该文件,但在站点目录下确...

dorebmoon
2017/12/15
0
0
luxda/zuul-redislimiter-spring-boot

中文 | English zuul-redislimiter-spring-boot 基于Zuul的限流器 快速开始 克隆, 编译,安装 git clone https://github.com/tangaiyun/zuul-redislimiter-spring-boot.gitcd zuulredislimi......

luxda
2018/12/14
0
0
Swagger2 Zuul 整合

Swagger2 Swagger2是一个RESTful接口进行描述和展示的工具,可以通过 springfox-swagger2 整合,生成相应的文档,需引入两个库: 通过 @Configuration 注解为配置类,通过 @EnableSwagger2 ...

林塬
2017/12/28
0
0
php5.5安装及phpmyadmin&nginx配置php模块

安装php5.5; 下载源地址:rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm rpm包安装:yum install php55w.x8664 php55w-cli.x8664 php55w-common.x8664 php55w-gd.x8664 php55w-......

邱野
2018/06/28
0
0
Building Microservices with Netflix OSS, Apache Kafka and Spring Boot - Part 3: Email Service

The next step of building our system is the email service. It will be a microservice configured to listen for the USERCREATEDTOPIC that comes from the user service. Here we will......

Iskren Ivanov
2017/12/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Angular 英雄编辑器

应用程序现在有了基本的标题。 接下来你要创建一个新的组件来显示英雄信息并且把这个组件放到应用程序的外壳里去。 创建英雄组件 使用 Angular CLI 创建一个名为 heroes 的新组件。 ng gener...

honeymoose
今天
4
0
Kernel DMA

为什么会有DMA(直接内存访问)?我们知道通常情况下,内存数据跟外设之间的通信是通过cpu来传递的。cpu运行io指令将数据从内存拷贝到外设的io端口,或者从外设的io端口拷贝到内存。由于外设...

yepanl
今天
6
0
hive

一、hive的定义: Hive是一个SQL解析引擎,将SQL语句转译成MR Job,然后再在Hadoop平台上运行,达到快速开发的目的 Hive中的表是纯逻辑表,就只是表的定义,即表的元数据。本质就是Hadoop的目...

霉男纸
今天
3
0
二、Spring Cloud—Eureka(Greenwich.SR1)

注:本系列文章所用工具及版本如下:开发工具(IDEA 2018.3.5),Spring Boot(2.1.3.RELEASE),Spring Cloud(Greenwich.SR1),Maven(3.6.0),JDK(1.8) Eureka: Eureka是Netflix开发...

倪伟伟
昨天
13
0
eclipse常用插件

amaterasUML https://takezoe.github.io/amateras-update-site/ https://github.com/takezoe/amateras-modeler modelGoon https://www.cnblogs.com/aademeng/articles/6890266.html......

大头鬼_yc
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部