为什么标题Map包含List <string>作为值而不是String?

时间:2018-05-18 07:03:53

标签: spring http

我在包org.springframework.security.web.savedrequest中看到了这段代码;

public class DefaultSavedRequest implements SavedRequest {
    private final Map<String, List<String>> headers;
}

我想知道,为什么这个Map的值是List<String>而不是String

1 个答案:

答案 0 :(得分:2)

因为HTTP允许一个标头具有多个值(Reference

  

发件人不得生成具有相同字段的多个标题字段   除非该标头的整个字段值,否则在消息中命名   字段被定义为以逗号分隔的列表[即,#(值)]或   标题字段是一个众所周知的例外(如下所述)。

     

收件人可以将多个标题字段与同一字段组合在一起   将name命名为一个“field-name:field-value”对,而不更改   消息的语义,通过附加每个后续字段值   按顺序组合的字段值,以逗号分隔。订单中   因此,接收具有相同字段名称的头字段   对组合场值的解释具有重要意义;代理人   转发时,不得更改这些字段值的顺序   消息。

将其视为Accept标题:

accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

修改

以下是在构造函数中保存标头的代码:

public DefaultSavedRequest(HttpServletRequest request, PortResolver portResolver)

Enumeration<String> values = request.getHeaders(name);

while (values.hasMoreElements()) {
    this.addHeader(name, values.nextElement());
}

如您所见,对于每个标题名称,返回值的枚举,然后程序迭代值并逐个添加。