我在包org.springframework.security.web.savedrequest中看到了这段代码;
public class DefaultSavedRequest implements SavedRequest {
private final Map<String, List<String>> headers;
}
我想知道,为什么这个Map
的值是List<String>
而不是String
?
答案 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());
}
如您所见,对于每个标题名称,返回值的枚举,然后程序迭代值并逐个添加。