我在org.springframework.security.web.savedrequest;包中看到了这段代码
public class DefaultSavedRequest implements SavedRequest {
private final Map<String, List<String>> headers;
}
我想知道,为什么这个Map
的值是List<String>
而不是String
?
发布于 2018-05-17 23:08:40
因为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());
}
如您所见,对于每个标头名称,返回一个值的枚举,然后程序对这些值进行迭代并逐一添加它们。
https://stackoverflow.com/questions/50405593
复制相似问题