美文网首页SpringFramework
Spring-web源代码阅读之对HTTP协议中概念的抽象(2)

Spring-web源代码阅读之对HTTP协议中概念的抽象(2)

作者: Eric_dsc | 来源:发表于2021-02-08 20:56 被阅读0次

接着上一篇聊一下Spring Web中对HTTP协议中概念的抽象。

对Header的抽象

在Sping Web中Header被抽象一个类,继承了org.springframework.util.MultiValueMap,关于MultiValueMap,看名字就可以了解到它是一个可以存储多值的Map,在Java API中的Map,key和value只能是一对一的。那在这里Header被抽象成了一个多值Map,也就是一个key可以对应多个值,这个应该好理解,因为Header有些项目就是一个Key可以对应多个值。

但是为什么Header没有抽象成接口呢?我们说一般不都是面向接口编程么?我理解,之所以抽象成类,是设计者认为Header更多的是作为数据来使用,无非就是一些对于请求或者响应的元数据描述,没有更多操作,也不需要接口来做约束。

看了HttpHeader的源码,发现其自身的各种set方法,都是调用一个公共的set方法来设置header的key和value,这个公共的set方法每次设置都是新new一个list对象,来存放这个key对应的值,如果你设置调用两次的话,前一个值会被替换,这一点需要注意。

如果要在一个header的key里添加多个值,可以调用其中的add方法。

对Cookie的抽象

对于Cookie的抽象也相对比较简单,它被抽象为了两个类,一个是HttpCookie,一个是ResponseCookie,其中ResponseCookie继承了HttpCookie,仅比HttpCookie多出了setCookie相关的Header信息。

HttpCookie代表了一个key-value键值对,代码里也只有一个name属性和一个value属性,非常简单。

ResponseCookie也代表了一个key-value键值对,但是它是用于服务器响应请求时返回的Cookie,所以有一些控制属性需要加入,例如过期时间Expires等等,具体有:Path、Domain、Max-Age、Expires、Secure和HttpOnly。

在ResponseCookie里还提供了一个内部静态的工厂方法,使我们只提供一个name和一个value就可以得到一个ResponseCookie对象,方便了我们在服务端进行Cookie的处理。

可以看到,即使是内部的一个工厂方法,还是使用了接口对其进行约束。

相关文章

网友评论

    本文标题:Spring-web源代码阅读之对HTTP协议中概念的抽象(2)

    本文链接:https://www.haomeiwen.com/subject/bgctxltx.html