Protocol-HTTP
- 1.HTTP协议
- 2.HTTP的特性
- 3.HTTP的注意事项
- 4.HTTP报文
- 5.条件GET
- 6.持久连接/连接重用
- 7.HTTP的keep-alive与TCP的keep-alive的关系
- 8.Transfer-Encoding
- 9.HTTP Pipelining(HTTP 管线化)
- 10.会话跟踪
- 11.跨站请求伪造/攻击CSRF(Cross-Site Request Forgery)
- 12.XSS(Cross Site Scripting,跨站脚本攻击)
- 13.浏览器输入一个URL的过程
- 14.Cookie
- 15.Session
- 16.WEB中的跨域
- 17.session共享
- 18.防止表单重复提交
- 19.SSO(Single Sign On,单点登录)
- 20.第三方登录(手机号/社交登录)
1.HTTP协议
HTTP(HyperText Transfer Protocol)超文本传输协议,是互联网上应用最为广泛的一种网络传输协议,详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传输万维网文档数据的传输协议。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
2.HTTP的特性
- HTTP构建于TCP/IP协议之上,默认端口号是80
- HTTP是无连接、无状态的
- HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
- Web服务器根据接收到的请求后,向客户端发送响应信息。
3.HTTP的注意事项
- HTTP是无连接:
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。- HTTP是媒体独立的:
只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型【MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型】。- HTTP是无状态:
HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
4.HTTP报文
4.1.请求报文
HTTP协议是以ASCII码传输,建立在TCP/IP协议之上的应用层规范,HTTP请求分为:请求行、请求头 、空行、请求包体。
4.1.1.请求行
请求行:请求方法、URL字段、协议版本
GET / HTTP/1.1
HTTP定义了与服务器交互的交互的方法【共9个】:
HTTP/0.9:
已过时。只接受 GET 一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持 POST 方法,所以客户端无法向服务器传递太多信息。
HTTP/1.0:
第一个在通讯中指定版本号的HTTP 协议版本,至今仍被广泛采用,特别是在代理服务器中。
HTTP/1.1:
持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度。
HTTP/1.1相较于 HTTP/1.0 协议的主要区别:
1. 缓存处理
2. 带宽优化及网络连接的使用
3. 错误通知的管理
4. 消息在网络中的发送
5. 互联网地址的维护
6. 安全性及完整性
HTTP0.9 只有一个GET命令,没有header等描述数据的信息,服务器发送完毕就关闭TCP连接
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
实际开发工作中:一般将POST, DELETE, PUT , GET认为是对资源的增、删、改、查操作
序号 | 请求方式 | 说明 |
---|---|---|
1 | GET | 请求指定的页面信息,并返回实体主体。【安全且幂等】 |
2 | HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头,不返回文档主体。【安全且幂等】 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在请求体中,POST 请求可能会导致新的资源的建立或已有资源的修改。 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
5 | PATCH | 对PUT方法的补充,用来对已知的资源进行局部更新。 |
6 | DELETE | 请求服务器删除指定的页面。 |
7 | OPTIONS | 查看服务器支持的 HTTP 方法;查看服务器的性能。对可能对服务器数据产生副作用【回退是否有害】的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型【MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型】的 POST 请求),浏览器必须首先使用 OPTIONS 发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
9 | CONNECT | HTTP/1.1协议中预留给能够将连接改为 Pipeline管道方式的代理服务器。把请求连接转换到透明的 TCP/IP 通道。 |
1.GET请求方式
GET请求:
GET / HTTP/1.1
1.功能:信息的获取【安全且幂等】
特点 | 说明 |
---|---|
安全 | GET操作用于获取信息,而非修改信息,仅仅是获取资源信息,不会修改、增加数据,不会影响资源的状态。 |
幂等 | GET操作的幂等意味着对同一个URL的多个请求应该返回同样的结果。 |
2.功能:数据提交
1.可提交的数据量小,4kb左右(不同浏览器会有差异)---->受到URL长度的限制【HTTP协议规范没有对URL的长度进行限制,URL长度的限制是特定的浏览器和特定的服务器进行限制的】;
2.在URL后面拼接参数,只能以【文本】的形式传递参数。
3.安全性低,会将信息显示在地址栏。
4.速度快,通常用于对安全性要求不高的请求。
3.注意
- GET 请求可被缓存,请求参数会被完整保留在浏览器历史记录里
- GET 请求可被收藏为书签
- GET 的参数直接暴露在URL上,不应在处理敏感数据时使用
- GET 请求在URL中传送的参数是有长度限制的
- GET 请求只应当用于取回数据
- GET 参数通过URL传递,且只能以【文本】的形式传递参数
- GET 请求只能进行url编码
- GET 在浏览器回退时是无害的【无副作用】,如果有缓存不会产生二次请求的发送,如果没有缓存,会发送一个安全且幂等的获取信息的GET请求
- GET 对于参数的数据类型,只接受ASCII字符
2.POST请求方式
一般用于数据的提交,包含数据的新增和修改,常用于表单的场合,只是可能修改变服务器上的资源的请求【可能:增加或者修改的结果有可能成功,也有可能失败,POST无法做出成功与否的保证,只能有后端的服务器进行数据 处理后才能被确认是否成功与否】
POST请求:
POST / HTTP/1.1
HTTP 协议中规定 POST 提交的数据必须在 body 部分中,但是协议中没有规定数据使用哪种编码
方式或者数据格式。实际开发中,完全可以自定义消息主体的格式,只要最后发送的 HTTP 请求
满足格式就可以。数据发送出去,还要服务端解析成功才有意义。一般服务端语言以及对应的web框架 Thymeleaf 、FreeMarker等,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。故而POST 提交数据方案,包含了 Content-Type 和消息主体编码方式两部分
1.POST数据提交方式:application/x-www-form-urlencoded
Content-Type: application/x-www-form-urlencoded
浏览器原生支持的,是最常见的 POST 数据提交方式。浏览器的原生 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式为二进制数据使用多重编码提交数据。 body 当中的内容和 GET 请求是完全相同的。
2.POST数据提交方式:multipart/form-data
Content-Type: multipart/form-data
浏览器原生支持的,使用表单上传文件时,必须让 表单的enctype 等于 multipart/form-data的方式为二进制数据使用多重编码提交文件数据
<form action="/fileUpload" method="post" enctype="multipart/form-data">
<input type='text' name='textfield' id='textfield' class='txt' />
<input type="file" name="file" class="file" id="fileField" />
<input type="submit" name="submit" class="btn" value="上传" />
</form>
上面提到的这两种 POST 数据的方式,都是浏览器原生支持的,而且现阶段标准中原生 表单也只支持这两种方式(通过 元素的 enctype 属性指定,默认为 application/xwww-form-urlencoded 。其实 enctype 还支持 text/plain,不过用得非常少)。
3.POST数据提交方式:text/plain
Content-Type: text/plain
将文件的content-type设置为纯文本的形式,如果是响应中设置,浏览器在获取到这种文件时并不会对其进行处理。使用频率非常低。
4.text/html和text/plain的区别
- text/html将文件的content-type设置为text/html的形式,浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理。
- text/plain将文件的content-type设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理。
5.注意
- POST 请求提交的数据必须在body中
- POST 请求没有在HTTP协议中被规定数据使用的编码格式或者数据格式,需要自行定义
- POST 请求提交的数据方案,包含Content-Type和消息主体编码方式两部分
- POST 请求对于使用thymeleaf、freemark等框架的web后台,服务端需要根据请求头中的Connect-Type来确认编码方式后然后才解析消息主体
- POST 请求不会被缓存
- POST 请求不会保留在浏览器历史记录中
- POST 请求不能被收藏为书签
- POST 请求对数据长度没有要求,HTTP 协议规范也没有进行大小限制,但是出于安全考
虑,服务器软件在实现时会做一定限制
4.1.2.请求头
客户端(浏览器)向服务器发送请求的时候必须指明请求类型(一般是GET或者POST)。如有必要,客户程序还可以选择发送其他的请求头。大多数请求头并不是必需的,但Content-Length除外。对于POST请求来说Content-Length必须出现。
请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。
1.典型的请求头
请求头部通知服务器有关于客户端请求的信息&#