Java Jetty-更改请求头的顺序
jetty似乎改变了接收到的报头的顺序。我使用Java Jetty-更改请求头的顺序,java,header,request,jetty,Java,Header,Request,Jetty,jetty似乎改变了接收到的报头的顺序。我使用HttpServletRequestWrapper对象上的getHeaderNames()收集它们 您知道是否有办法使它们与请求中设置的顺序相同吗?头顺序仅保证在相同的头名称内(根据HTTP规范和Servlet规范) 意思是 Host: localhost Cookie: foo Cookie: bar Cookie: baz Accept: gzip 使用getHeaderNames()只会返回头名称的无序集合[Cookie,Host,Accep
HttpServletRequestWrapper
对象上的getHeaderNames()
收集它们
您知道是否有办法使它们与请求中设置的顺序相同吗?头顺序仅保证在相同的头名称内(根据HTTP规范和Servlet规范) 意思是
Host: localhost
Cookie: foo
Cookie: bar
Cookie: baz
Accept: gzip
使用getHeaderNames()
只会返回头名称的无序集合[Cookie,Host,Accept]
但是
getHeaders(“Cookie”)
将返回顺序[foo,bar,baz]
为了回答我的问题,标题按照请求的顺序存储在一个数组中。但是,方法getHeaderNames()
基于数组的每个元素构建一个集合。集合不保持元素的顺序
旁路问题的一个解决方案是使用LinkedHashSet
而不是HashSet
覆盖类org.eclipse.jetty.http.HttpFields
的方法getFieldNameCollection()
另一个影响较小的解决方案是编写一个静态定制
方法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
也许还有其他更优雅的解决方案。请随意添加。嗨,Joakim,谢谢你的回答。我的目标是获得标题的有序列表,而不是标题的值。我知道HTTP/1.1规范并不能保证头的顺序,但对于特定的需要,我想得到它。似乎
getHeaderNames()
总是以相同的顺序返回头,但不是以请求的顺序返回头,因此我想知道是否有办法实现这一点。正如前面所述,Servlet规范不支持这一点。这一事实也适用于SPDY和HTTP/2。还要知道中介机构(代理、负载平衡器等)可以更改顺序以满足自己的需要。目的是什么?它没有在HTTP RFCs中定义。你怎么可能需要依赖它呢?