【问题标题】:Modify query params in a Zuul filter在 Zuul 过滤器中修改查询参数
【发布时间】:2016-06-03 21:42:37
【问题描述】:

我正在尝试创建一个过滤器(“pre”,50),如果这些参数不存在,它将向请求添加默认查询参数。

到目前为止,我的工作基于以下组合:

创建新请求: http://www.ocpsoft.org/opensource/how-to-safely-add-modify-servlet-request-parameter-values/

在 RequestContext 对象中设置新请求: How to pass modified/wrapped HTTPServletRequest to subsequent Zuul Filters?

Map<String, String[]> extraParams = new TreeMap<String, String[]>();

if (!params.containsKey("language")) {
    extraParams.put("language", new String[]{"en"});
    params.put("language", Arrays.asList("en"));
}
if (!params.containsKey("country")) {
    extraParams.put("country", new String[]{"us"});
    params.put("country", Arrays.asList("us"));
}

HttpServletRequest request = ctx.getRequest();
HttpServletRequest wrapped = new WrappedRequest(request, extraParams);
ctx.setRequest(wrapped);
ctx.setRequestQueryParams(params);

我还使用新参数修改了 RequestQueryParams,但它似乎也不起作用。

有什么想法吗?

【问题讨论】:

    标签: java spring-boot netflix-zuul


    【解决方案1】:

    我之前也遇到过这个问题,请按照以下方法:

        Map<String, List<String>> params = ctx.getRequestQueryParams();
        if (params == null) {
            params = Maps.newHashMap();
        }
        for (String key : checkMap.keySet()) {
            params.put(key, Lists.newArrayList(checkMap.get(key).toString()));
        }
        ctx.setRequestQueryParams(params);
    

    【讨论】:

    • 直接从 Zuul 上下文中使用 ctx.getRequestQueryParams() 对我有用,对于状态码也有类似的技术。我会接受这个简单直接的答案。
    【解决方案2】:

    您必须创建一个添加到请求中的自定义路由过滤器。

    看一下 RibbonRoutingFilter 的代码,它根据传入的请求创建一个新请求,然后将新请求路由到服务。它也与查询参数一起使用,这可能会帮助您指导您如何向其中添加更多参数。

    【讨论】:

      【解决方案3】:

      参见 SendResponseFilter.getQueryString() 并将新过滤器创建为 SendResponseFilter.java ,编辑 getQueryString()。 并设置: zuul.SimpleHostRoutingFilter.route.disable=true

      【讨论】:

        猜你喜欢
        • 2018-12-28
        • 1970-01-01
        • 1970-01-01
        • 2020-08-21
        • 1970-01-01
        • 2018-01-10
        • 1970-01-01
        • 2014-02-06
        • 1970-01-01
        相关资源
        最近更新 更多