大家都知道,往HttpServletResponse添加响应头的时候, 都是通过key-value的形势添加的。
如下代码:
public void test(HttpServletResponse response) throws IOException {
response.addHeader("Accept", "text/plain");
response.addHeader("Accept", "text/html,*.*, q=0.1 ");
response.getWriter().write("test");
response.getWriter().close();
}
不知大家有没有发现,上面的代码王response里添加了两个Accept,事实上, 这也是我想讨论的问题的重点。
1)为什么可以添加两个Accept?
参考: https://www.cnblogs.com/LiLihongqiang/p/5951460.html 2.Accept:
|
既然两个可以添加两个Accept, 那么谁的优先级高呢?
这个问题我后续再研究。这篇文章主要研究下面的问题。
2)而对于Spring定义的HttpHeader,事实上却是一个Map.
public class HttpHeaders implements MultiValueMap<String, String>, Serializable
public interface MultiValueMap<K, V> extends Map<K, List<V>>
由此可见,它不是简单的由String组成的Key, Value
而是一个Key对应一个List<String>, 效果如下图,可见文章开头的两个Accept的Value被合并在一起了。
这是如何实现的呢,秘密就在下面的代码中。
//
final class SimpleClientHttpResponse extends AbstractClientHttpResponse {
@Override
public HttpHeaders getHeaders() {
if (this.headers == null) {
this.headers = new HttpHeaders();
// Header field 0 is the status line for most HttpURLConnections, but not on GAE
String name = this.connection.getHeaderFieldKey(0);
if (StringUtils.hasLength(name)) {
this.headers.add(name, this.connection.getHeaderField(0));
}
int i = 1;
while (true) {
name = this.connection.getHeaderFieldKey(i);
if (!StringUtils.hasLength(name)) {
break;
}
this.headers.add(name, this.connection.getHeaderField(i));
i++;
}
}
return this.headers;
}