Jetty - 更改请求标头的顺序

时间:2017-06-20 16:02:42

标签: java header request jetty

似乎码头改变了收到的标题的顺序。我在getHeaderNames()对象上使用HttpServletRequestWrapper收集它们。

您是否知道是否有办法按照与请求中设置的顺序相同的顺序获取它们?

2 个答案:

答案 0 :(得分:1)

要回答我的问题,标题按请求的顺序存储在数组中。但是,方法getHeaderNames()基于数组的每个元素构建一个集合。该集合不保持元素的顺序。

绕过此问题的一个解决方案是使用getFieldNamesCollection()而不是org.eclipse.jetty.http.HttpFields覆盖类LinkedHashSet的方法HashSet

另一种影响较小的解决方案是编写静态自定义 方法getHeaderNames(),如下所示:

static public String buildHeaderList(ServletRequest request){
    StringJoiner headerList = new StringJoiner(",");

    Request req = (Request) request;
    HttpFields fields = req.getMetaData().getFields();

    for (HttpField f : fields)
    {
        if (f!=null)
            headerList.add(f.getName());
    }

    return headerList.toString();
}

请求对象的类型为org.eclipse.jetty.server.Request

可能还有其他更优雅的解决方案。请随意添加任何内容。

答案 1 :(得分:0)

标题顺序仅保证在相同的标题名称内(根据HTTP规范和Servlet规范)。

含义......

Host: localhost
Cookie: foo
Cookie: bar
Cookie: baz
Accept: gzip

使用getHeaderNames()只会返回标题名称[Cookie, Host, Accept]

的无序集合

getHeaders("Cookie")会返回订单[foo, bar, baz]