[SpringMVC]HttpServletResponse的header头与Spring定义的HttpHeader的比较

大家都知道,往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: 
这一字段包含了一个分隔的请求方案列表,它将在这个请求的回应中被接受。这一字段可能会根据RCFC822被包装成几行,并且这个字段不仅仅一次的发生也是被接受的,好像所有的入口已经在一个域种了。列表中每个入口的模式如下: 
<field> =   Accept: <entry> *[ , <entry> ] 
<entry> =   <content type> *[ ; <param> ] 
<param> =   <attr> = <float> 
<attr>   =   q / mxs / mxb 
<float> =   <ANSI-C floating point text represntation> 
注意在上述语法中分号的优先级高于逗号,这是为了符合多用途的忘记邮件扩充协议。 
记入没有Accept字段出现,那么假定无格式正文和html正文被接受。 
Example 
Accept: text/plain, text/html 
Accept: text/x-dvi; q=.8; mxb=100000; mxt=5.0, text/x-c 
为了节省时间,并且也允许客户接受他们可能不会意识到的content type一个星号也许被使用在下面的地方,either the second half of the content-type value, or both halves。这仅仅被应用于Accept,而且不是对于content-type field of course的。 
Example 
Accept: *.*, q=0.1 
Accept: audio/*, q=0.2 
Accept: audio/basic q=1 

 

既然两个可以添加两个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;
	}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值