SimpleHostRoutingFilter
@Override public Object run() { RequestContext context = RequestContext.getCurrentContext(); HttpServletRequest request = context.getRequest(); MultiValueMapheaders = this.helper .buildZuulRequestHeaders(request); MultiValueMap 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; }
重点关注
MultiValueMapparams = this.helper .buildZuulRequestQueryParams(request);
在ProxyRequestHelper类里头
public MultiValueMapbuildZuulRequestQueryParams( HttpServletRequest request) { Map > map = HTTPRequestUtils.getInstance().getQueryParams(); MultiValueMap 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> getQueryParams() { Map > qp = RequestContext.getCurrentContext().getRequestQueryParams(); if (qp != null) return qp; HttpServletRequest request = RequestContext.getCurrentContext().getRequest(); qp = new HashMap >(); 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 valueList = qp.get(name); if (valueList == null) { valueList = new LinkedList (); 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 valueList = qp.get(name); if (valueList == null) { valueList = new LinkedList (); qp.put(name, valueList); } valueList.add(value); } } RequestContext.getCurrentContext().setRequestQueryParams(qp); return qp; }
这里优先取了RequestContext.getCurrentContext().getRequestQueryParams();
因此,对于url路由的服务来说,可以修改context的queryParam来达到修改请求参数的目的。想获取最新内容,请关注微信公众号