为什么标题映射包含列表<String>作为值而不是字符串?



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

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

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

因为HTTP允许一个标头具有多个值(参考)

发件人不得使用同一字段生成多个标头字段 邮件中的名称,除非该标头的整个字段值 字段定义为逗号分隔的列表 [即 #(值)] 或 标头字段是一个众所周知的异常(如下所述)。

收件人可以将多个标头字段与同一字段组合在一起 名称为一个"字段名称:字段-值"对,而不更改 消息的语义,通过将每个后续字段值附加到 按顺序排列的组合字段值,用逗号分隔。中的顺序因此,接收哪些具有相同字段名称的标头字段 对组合字段值的解释具有重要意义;代理 转发 消息。

把它想象成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());
}

如您所见,对于每个标头名称,返回一个值枚举,然后程序循环访问这些值并逐个添加它们。

最新更新