今天学了一下《java Web程序设计》——黑马程序员编程 第4章部分,先做一下总结。
概述
http协议全称HtypeText Transfer Protocol 超文本传输协议,是一种应用层协议。http协议是专门用于定义浏览器(客户端)与服务器之间交换数据以及数据本身的格式。
特点
基于TCP协议。
简单快速。浏览器(客户端)向服务端发送请求,只需传送请求方式和请求路径。
灵活。允许传送任意类型的数据,正在传输的数据类型由Cont-Type标记。
无状态。无状态是指对事物处理没有记忆,如果后续处理需要前面的信息,则必须重新传输,可能导致每次传输的数据量增大。
当用户在浏览器中访问某个URL地址、单击某个链接、提交网页上的form表单时,浏览器都会向服务器发送请求数据,即http请求消息
服务器接收到请求数据后,会将处理后的数据发送个客户端,即http响应消息
一个完整的请求消息由请求行、请求头、实体内容三部分组成,每个部分有各自的作用。
http请求行位于请求消息的第一行,包括三个部分,分别时是请求方式、资源路径、http版本
例:
GET /index.html HTTP/1.1
其中GET是请求方式,index.html为请求资源路径,HTTP/1.1为协议版本
http的8种请求方式
请求方式 | 含义 |
---|---|
GET | 请求获取请求行的URL所标识的资源 |
POST | 向指定资源提交数据,请求服务器处理 |
HEAD | 请求获取URL所标识资源的响应消息头 |
PUT | 将网页放置指定URL位置上(上传、移动) |
DELETE | 请求服务器删除URL所标识的资源 |
TRACE | 请求服务器回送收到的请求信息,(主要用于测试和诊断) |
CONNECT | 保留供将来使用 |
OPTIONS | 请求查询服务器的性能,或者查询与资源相关的选项和需求 |
最常用的是GET和POST请求
在以下情况
浏览器地址栏直接输入某个URL时
单击网页链接时
将form表单的method属性设置为GET(默认为GET,可以不设置),提交表单时
其他自定义为GET请求时,
浏览器将使用GET方式发送请求
特点
请求参数传递数据
如果请求的URL中有参数部分,在浏览器生成的请求消息中,参数部分将附加在请求行的资源路径后面
用?
提示后面的参数部分,参数由参数名=参数值
组成,多个参数用&
隔开
带参URL示例
wwww.index.cn/javaForum?name=lee&psd=hnxy
发送请求消息时,上述参数部分附加在要访问的资源后面,具体如下
GET /javaForum?name=lee&psd=hnxy HTTP/1.1
GET方式传输数据量有限,最多不能超过2KB。
在以下情况
将form表单的method属性设置为POST,提交表单时
其他自定义为POST请求时
浏览器将使用POST方式发送请求
当用户提交POST请求类型表单时,浏览器会把form表单元素和数据作为http消息的实体内容发送给服务器,而不是作为URL地址的参数传递。
另外在使用POST方式发送请求时
Content-Type消息头自动设置为“application/x-www-form-urlencoded”
Content-Length消息头会自动设置为实体内容的长度
服务器会采用与获取URL后面参数相同的方式来获取表单各个段的数据。
POST请求与GET请求区别
POST传输数据大小无限制,GET最多可传递2KB数据
POST比GET更加安全
GET请求方式的参数信息都会在URL地址栏显示,而POST请求方式传递的参数隐藏在实体内容中,用户看不到。
请求头主要向服务器传递附加消息,例如浏览器(客户端)可以指定接收的数据类型、压缩方法、语言、发送请求所属页面的URL地址信息等。
每个请求头都是由头字段名称和值构成
头字段名称和值之间用冒号加空格(:)隔开
多个请求头之间用换行隔开
头字段名称不区分大小写,习惯上将单词的第一个字母大写
常用的请求头字段
头字段 | 说明 |
---|---|
Accept | 指出浏览器(客户端)能处理的MIME类型 |
Accept-Charset | 告知服务器客户端所使用的字符集 |
Accept-Encoding | 指定客户端能够进行解码的数据编码方式,这里指的是某种压缩方式 |
Accept-Language | 指定客户端期望服务器返回哪个国家语言的文档 |
Authoriztion | 当访问受口令保护时,服务器会发送401响应状态码和WWW-Authenticate请求头,要求浏览器(客户端)使用Authoriztion请求头应答 |
Host | 指定资源所在主机名和端口号 |
If-Match | 当客户再次向服务器请求这个网页文件时,可以使用If-Match头字段附带以前缓存的实体标签内容,这个请求被视为一个条件请求 |
If-Match-Since | 与If-Match类似,不过它的值为GMT格式的时间 |
Range | 指定服务器只需返回文档的部分内容及内容范围,(常用于较大文件的断点续传) |
If-Range | 伴随Range出现,其值可以是实体标签或GMT格式时间 |
Max-Forward | 指定当前请求可以途径的代理服务器数量,每经过一个服务器,其值减一 |
Refere | 追踪网站访问者是如何导航进入网站的,同时Refere头字段还可以用于防盗链(非常有用) |
User-Agent | 用户代理,指定浏览器(客户端)使用操作系统及版本、浏览器版本、浏览器渲染引擎、浏览器语言等,以便服务器针对不同类型的浏览器返回不同内容 |
部分头字段详解
指出浏览器(客户端)能处理的MIME类型
例,浏览器和服务器同时能处理png类型图片,则浏览器可以发送image/png的Accept头字段。
MIME类型有多种,
例
Accept:text/html,表明可以接收HTML文本
Accept:image/gif,表明可以接收gif格式图像文件
Accept:image/*,表明可以接收所有image格式文件
Accept:*/*,表明可以接收任意格式内容
2.Accept-Encoding
指定客户端能够进行解码的数据编码方式,这里指的是某种压缩方式。
在Accept-Encoding头字段中,可以指定多种数据解码方式,它们之间用逗号隔开
示例
Accept-Encoding: gzip,compress
上述头字段中,gzip和compress是最常见的数据编码方式。在传输较大实体内容时,对其进行压缩编码,可以节省网络带宽和传输时间。
服务器在收到这个请求头后,使用其中指定的一种格式对原始文档内容进行压缩编码,然后将其作为响应消息的实体内容发送给客服端,并且在Content-Encoding响应头中指出实体内容所使用的压缩编码格式。浏览器接收到这样的实体内容后,要对其进行反向解压缩。
指定资源所在主机名和端口号
示例
Host: www.itcast.cn:80
上述示例中,因为浏览器连接服务器时默认使用的是80端口,所以“:80”可以省略
注意:
在HTTP1.1中,浏览器和其他客户端发送的每个请求消息中必须Host请求头。
当浏览器访问Web站点时,会根据地址栏中的URL自动生成相应的Host请求头
与If-Match类似,不过它的值为GMT格式的时间
If-Modified-Since请求头被视作一个请求条件,只有服务器中文档的修改时间比If-Modified-Since请求头指定的时间新,服务器才会返回文档内容。否则服务器返回一个304状态码表示浏览器缓存的文档是最新的,而不向浏览器返回文档内容,这时浏览器任然使用以前缓存的文档。
浏览器向服务器发出的请求,可能是直接在浏览器中输入URL地址发出的,也可能是单击一个链接发出的。
对于第一种情况,浏览器不会发出Refere请求头。而对于第二种情况,会发出Refere请求头.
示例
Refere: http://locahost:8080/chapter/GET.html
后面值的内容只是原来所处的位置
Refere头字段非常好用,常被网站管理者用于追踪网站的访问者是如何导航进网站的。
同时Refere头字段还用于网站的防盗链
什么是防盗链?
假设一个网站想显示一些图片,而该网站的服务器并没有这些资源(或不想公开),它通过标签链接到其他网站的图片资源,将其展现给浏览者,这就是盗链。
盗链的网站提高了自己网站的访问效率,却加重了链接网站服务器的负担,损害了其合法利益。所以可以通过Refere头检测出从哪里链接到当前网页或资源,一旦检测到不是本站的链接进行访问的,可以阻止访问或跳转到指定页面。
User-Agent(UA,用户代理)用于指定浏览器(客户端)程序使用的操作系统及版本、浏览器版本、浏览器渲染引擎、浏览器语言等。
例,服务器检查User-Agent,发现其是一个无线手持终端,就返回一个WML文档;如果客户端是一个普通浏览器,就返回一个HTML文档。
附带的自定义或参数信息。
当浏览器收到浏览器(客户端)请求后,会发送响应消息个浏览器(客户端)。一个完整的响应消息包括响应状态行、响应头、实体内容
http响应状态行位于响应消息第一行,它包括三个部分,HTTP版本、状态码(一个代表响应状态的整数代码)、对状态码进行描述的文本信息。
示例
HTTP/1.1 200 OK
HTTP/1.1表示版本,200是状态码,OK是状态描述,说明客户端请求成功。
状态码由三个数字组成,表示请求是否被理解或满足。第1个数字有5种取值
1XX:表示请求已接收,需要继续处理
2XX:表示请求已成功接收、理解并接受
3XX:为完成请求,客户端需进一步细化请求
4XX:客户端的请求有错误
5XX:服务器出现错误
状态码 | 说明 |
---|---|
200 | 服务器成功处理了客户端请求。响应消息返回正常的请求结果 |
302 | 请求的资源临时从不同的URL响应请求,但请求者应继续使用原位置来进行以后得请求。 |
304 | 表示客户端缓存版本是最新的,客户端应继续使用它。 |
404 | 服务器找不到请求的资源。 |
500 | 服务器发生错误,无法处理客户端的请求。 |
服务器向客服端传递附加信息。
常见响应头字段
头字段 | 说明 |
---|---|
Accept-Range | 标识服务器自身支持的范围请求,具体值用于定义范围请求的单位,单位值可以是none/bytes |
Age | 当前网页文档可以在客户端/代理服务器中缓存的有效时间,单位:秒 |
Etag | 向客户端传送代表实体内容特征的标记信息,这些标记信息称为实体标签 |
Location | 通知客户端获取请求文档的新地址,其值为一个使用绝对路径的URL |
Retry-After | 可与503状态码配合使用,告诉客户端在什么时间可以重新发送请求。也可以和一个3XX状态码配合使用,告诉客户端处理重定向的最小延时时间。其值可以是一个GMT格式时间,也可以是一个以秒为单位的时间数。 |
Server | 指定服务器软件产品名称 |
Vary | 指定影响了服务器所生成的响应内容的那些请求头字段名 |
WWW-Authenticate | 当客户端访问受口令保护的网页文件时,服务器会在响应消息中回送01(Unauthorized)响应状态码和WWW-Authenticate响应头,指示客服端应该在Authenticate请求头中使用指定的认证方式提供用户名和密码 |
Proxy-Authenticate | 用于代理服务器的用户信息验证,用法与WWW-Authenticate类似 |
Refresh | 告诉浏览器自动刷新时间,以秒为单位的时间数 |
Content-Disposition | 指示浏览器(客户端)不直接处理响应的实体内容,而是让用户将响应的实体内容做其他处理 |
告知客户端获取请求文档的新地址,其值为一个使用绝对路径的URL
常与3XX状态码配合使用,以便通知客户端自动重新连接到新的地址请求文档。
因为当前响应并没有内容返回,所以使用Location响应头的HTTP消息不应有实体内容。
可见在HTTP消息头不能同时出现Location和Content-Type这两个头字段。
指定服务器软件产品名称
告诉浏览器自动刷新时间,以秒为单位的时间数
例
Refresh: 3
注:在Refresh头字段的时间值后可以加一个URl参数(用“;”隔开),告诉客户端在指定时间后跳转到其他网页。
指示浏览器(客户端)不直接处理响应的实体内容,而是让用户将响应的实体内容保存在某个文件中
Content-Disposition头字段没有在HTTP的标准规范中定义,它是从RFC2183中借鉴而来。
指示接收程序处理数据方式,有inline和attachment两种标准方式。
inline表示直接处理
attachment要求用户干预并控制接收程序处理数据内容的方式。后面可指定filename参数,表示服务器建议浏览器保存实体内容的文件名称,浏览器应该忽略filename参数的目录部分,只取最后部分为文件名。
在Content-Disposition前,一定要设置Content-Type头字段
例
Content-Type: application/octet-stream Content-Disposition: attachment;filename=lee.zip