重温Http协议--请求报文和响应报文
http协议是位于应用层的协议,我们在日常浏览网页比如在导航网站请求百度首页的时候,会先通过http协议把请求做一个类似于编码的工作,发送给百度的服务器,然后在百度服务器响应请求时把相应的内容再通过http协议做一个类似于解码的工作,这样浏览器才能理解这个数据,然后为我们展示出来百度首页.
这相当于是一种规范,网络中数据的传输在位于应用之下的各层(传输层,应用层)来完成的,在tcp/ip协议接收到数据时,我们是不能直接使用和浏览的,需要先通过一种规范来进行梳理,也就是解码,得到浏览器支持的一种格式,才能被我们使用.
在web开发中,熟悉http协议中的报文结构是很重要的,比如,如果对http报文不熟悉,在使用httpServletRequest很多方法的时候,就会陷入懵逼.
http报文分为请求报文和响应报文.
请求报文(request message)
请求报文分为三部分:首行,请求头,请求体.
首行包括:请求类型,URL,HTTP版本.
请求头部保存一些键值对的属性.
请求体保存具体内容,一般为POST类型的参数.
常见的HTTP请求头属性
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept:告诉服务端,该请求所能支持的响应数据类型,专业术语称为MIME 类型,上图中表示支持text/html的响应格式.
扩展:text/html,application/xhtml+xml,application/xml 都是 MIME 类型,也可以称为媒体类型和内容类型,斜杠前面的是 type(类型),斜杠后面的是 subtype(子类型)
Cookie:seraph.confluence=6389808%3A04c906749aac37bbfe595ff3149ac5c17bfcd298;Hm_lvt_4a7d8ec50cfd6af753c4f8aee3425070=1477401172,1479201037,1479895114; _ga=GA1.2.1021401543.1477401172; JSESSIONID=6C331887C562AF7839384C41D590CA9A;
Cookie:将客户端的cookie放在请求头里一并发送给服务器端.
这里就出了一个问题,网站A怎么保证自己请求体中保存的cookie就是网站A的cookie而不是网站B的cookie呢,这就和cookie里面的jsessionid有关系了,关于cookie,session,sessionid,jsessionid的区别联系,可以参考这个博文http://www.cnblogs.com/fnng/archive/2012/08/14/2637279.html
referer:https://www.baidu.com/linkurl=fjKPqTaoZV2a2g2H2kbBwdz0mgBgI06WLrVLrQhiKgu&wd=&eqid=841d77d20000a7ae00000004586b7070
Referer:表示这个请求是从哪个url跳过来的,通过百度来搜索淘宝网,那么在进入淘宝网的请求报文中,Referer的值就是:www.baidu.com
Cache-Control:max-age=0
Cache-control:对服务端返回的相应内容进行缓存控制,即是否需要在客户端保存下来,如上表示不缓存.
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
User-Agent:用户代理,简称 UA,是一个特殊字符串头,使得服务器能够识别客户端使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等信息
Connection:keep-alive
Connection:表示客户端与服务连接类型;Keep-Alive表示持久连接
更多请求头属性可以参考这篇文章:HTTP响应头和请求头信息对照表
响应报文(response message)
响应报文也由三部分组成,首行,响应头,响应体.
首行分为报文协议及版本,响应码及状态描述
状态码
1XX:信息性状态码
2XX:成功状态码,200 表示成功
3XX:重定向状态码
4XX:客户端错误状态码,404表示没有找到请求的资源
5XX:服务器端错误状态码,500表示内部错误
关于响应报文的响应头属性,可以详见上面那个对照表链接.
需要提一下的是,我们可以通过HttpServletResponse的setHeader()方法来自行添加响应头属性.