http协议入门手札1
文章目录
【注意】最后更新于 December 8, 2021,文中内容可能已过时,请谨慎使用。
HTTP 最初是 Tim BernersLee 1989 年在欧洲核子研究组织(CERN)所发起的这个设想的基本理念是:借助多文档之间相互关联形成的超文本(HyperText),连成可相互参阅的 WWW(World Wide Web,万维网)。用于传输的超文本传输协议(HyperText Transfer Protocol),即 HTTP 由此诞生
HTTP 本身是一个简单的请求-响应协议,它通常运行在 TCP 之上。从整个网络模型来看,HTTP 是应用层的一个协议。在 OSI 七层模型中,HTTP 位于最上层。它并不涉及数据包的传输,只是规定了客户端和服务器之间的通信格式。定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以 ASCII 码形式给出
http历史
http/0.9
最初的版本,发布于1990年,这个版本只有一个命令:GET,并且只能返回html格式的字符串
http/1.0
发布于1996年,增加了POST和HEAD命令,并且可以发送任何格式的内容
同时对格式进行了修改,除了数据部分,每次通信都必须包括头信息(HTTP header),用来描述一些元数据。另外还增加了状态码、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等等
http/1.1
HTTP/1.0 主要缺点是,每一次建立 TCP 连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。如果多次请求,势必就会对服务器产生较大的资源性能损耗
1997 年 1 月公布的 HTTP/1.1 是目前主流的 HTTP 协议版本
这个版本最大的变化就是将持久化连接加入了 HTTP 标准,即 TCP 连接默认不关闭,可以被多个请求复用。此外,HTTP/1.1 版还新增了许多方法,例如:PUT、PATCH、HEAD、OPTIONS、DELETE。得到进一步完善的HTTP/1.1 版本,一直沿用至今
http组成
http可以传输任何数据 数据类型使用cotent-Type标记
http是无状态的,无法记录事务信息,如果后续处理需要前面的信息,则它必须重传
HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文
常用的请求报头
-
Cache-Control
用于指定缓存指令
-
Accept
Accept请求报头域用于指定客户端接受哪些类型的信息。eg:Accept:image/gif,表明客户端希望接受GIF图象格式的资源;Accept:text/html,表明客户端希望接受html文本。
-
Accept-Charset
Accept-Charset请求报头域用于指定客户端接受的字符集。eg:Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
- Accept-Encoding Accept-Encoding请求报头域类似于Accept,但是它是用于指定可接受的内容编码。eg:Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。
-
Accept-Language
Accept-Language请求报头域类似于Accept,但是它是用于指定一种自然语言。eg:Accept-Language:zh-cn.如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。
- Authorization Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。
-
Host(发送请求时,该报头域是必需的)
Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的,eg:
我们在浏览器中输入: http://baidu.com
浏览器发送的请求消息中,就会包含Host请求报头域,如下:
Host: baidu.com
此处使用缺省端口号80,若指定了端口号,则变成:Host:baidu.com:指定端口号
-
User-Agent
User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不过,这个报头域不是必需的
常用响应报头
-
Location Location响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候
-
Server Server响应报头域包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。下面是Server响应报头域的一个例子:
Server:Apache-Coyote/1.1 WWW-Authenticate WWW-Authenticate响应报头域必须被包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。
eg:WWW-Authenticate:Basic realm=“Basic Auth Test!” //可以看出服务器对请求资源采用的是基本验证机制。
常用实体报文
-
Content-Encoding Content-Encoding实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。Content-Encoding这样用于记录文档的压缩方法,eg:Content-Encoding:gzip
-
Content-Language
Content-Language实体报头域描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言阅读者。eg:Content-Language:da
- Content-Length
Content-Length实体报头域用于指明实体正文的长度,以字节方式存储的十进制数字来表示。
- Content-Type
Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型。eg: Content-Type:text/html;charset=ISO-8859-1 Content-Type:text/html;charset=GB2312
- Last-Modified
Last-Modified实体报头域用于指示资源的最后修改日期和时间。
- Expires
Expires实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和降低服务器负载)的页面,我们可以使用Expires实体报头域指定页面过期的时间。eg:Expires:Thu,15 Sep 2006 16:23:12 GMT
HTTP1.1的客户端和缓存必须将其他非法的日期格式(包括0)看作已经过期。eg:为了让浏览器不要缓存页面,我们也可以利用Expires实体报头域,设置为0,jsp中程序如下:response.setDateHeader(“Expires”,“0”);
http基本认证
浏览器和web服务器之间可以使用cookie来进行身份识别
桌面应用程序一般不会使用cookie, 而是把 “用户名+冒号+密码"用BASE64编码的字符串放在http request中的headerAuthorization中发送给服务端,这种方式叫HTTP基本认证(BasicAuthentication)
cookie
大致把Cookie分为2类: 回话cookie和持久cookie
会话cookie: 是一种临时的cookie,它记录了用户访问站点时的设置和偏好,关闭浏览器,会话cookie就被删除了
持久cookie: 存储在硬盘上,(不管浏览器退出,或者电脑重启,持久cookie都存在), 持久cookie有过期时间
浏览器把cookie通过HTTP Request 中的“Cookie: header”发送给Web服务器
Web服务器通过HTTP Response中的"Set-Cookie: header"把cookie发送给浏览器
cookie和session
Web容器比如tomcat就为当前用户生成一个SessionID,并且以这个SessionID为索引,存储这个用户相关的键值对,比如用户名,登陆时间一类的.存储在服务器的内存中.同时再response里向用户浏览器中设置一个cookie, 这个cookie的名字为jsessionid,内容为服务器生成的随机数SessionID. 在用户第二次请求时,将这个cookie发给服务器,服务器根据这个SessionID到内存中寻找相关数据,把用户名什么的提取出来,服务器就可以在本来无状态的HTTP连接中识别出这是哪个客户发出的请求,然后绘制相关页面
创建Session
request.getSession()
JSESSIONID就是Sessionid
cookie由前端保存
Sessionid保存在后端
后端通过jsessionid来判断Session
Session cookie(存储在浏览器内存中) 和persistent cookie(保存在客户端硬盘)
参考资料
文章作者 lialzm
上次更新 2021-12-08