我在包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());
}
如您所见,对于每个标头名称,返回一个值枚举,然后程序循环访问这些值并逐个添加它们。