特点
支持客户/服务器模式
- 客户/服务器模式工作的方式是由客户端向服务器发出请求,服务器端响应请求,并进行响应服务
简单快速
- 客户端向服务器请求服务时,只需传送请求方法和路径
- 请求方法常用的有GET、POST、HEAD.每种方法规定了客户端与服务器联系的类型不同
- 由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度快
灵活
- HTTP允许传输任意类型的数据对象
- 正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记
无连接
- 无连接的含义是限制每次连接只处理一个请求
- 服务器处理完客户的请求,并收到客户的应答后,即断开连接
- 采用这种方式可以节省传输时间
无状态
- HTTP协议是无状态协议
- 无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大
- 另一方面,在服务器不需要先前信息时它的应答就较快
每个请求都是完全独立的,每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接,多个实例对于同一个请求响应的结果是完全一致的,因为服务器不知道客户端是什么状态。即我们给服务器发送HTTP
请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。
有状态就是无状态的对立,服务的实例可以将一部分数据随时进行备,服务器进行交流的时候知道这个是谁,会对请求进行记录。
HTTP
就是无状态的,TCP
就是有状态的,当然HTTP
可以通过Cookie
和Session
来变成有状态的。
URI和UR
- URI = Uniform Resource Identifier 统一资源标志符,用来标识抽象或物理资源的一个紧凑字符串。
- URL = Uniform Resource Locator 统一资源定位符,一种定位资源的主要访问机制的字符串,一个标准的URL必须包括:protocol、host、port、path、parameter、anchor。
- URN = Uniform Resource Name 统一资源名称,通过特定命名空间中的唯一名称或ID来标识资源。
大白话,就是URI是抽象的定义,不管用什么方法表示,只要能定位一个资源,就叫URI,本来设想的的使用两种方法定位:1,URL,用地址定位;2,URN 用名称定位。
HTTP报文结构分析-请求报文
结构
请求有三部分组成:请求行、消息报头、请求正文。
请求行组成
请求方法+统一资源标识符+HTTP
协议版本(Method + Request-URI + HTTP-Version
)
一般请求方法有:GET
请求获取Request-URI
所标识的资源;POST
在Request-URI
所标识的资源后附加新的数据。
HTTP
的八种请求方式:
-
GET
请求获取Request-URI
所标识的资源
-
POST
在Request-URI
所标识的资源后附加新的数据
-
HEAD
请求获取由Request-URI
所标识的资源的响应消息报头
-
PUT
请求服务器存储一个资源,并用Request-URI
作为其标识
-
DELETE
请求服务器删除Request-URI
所标识的资源
-
TRACE
请求服务器回送收到的请求信息,主要用于测试或诊断
-
CONNECT
保留将来使用
-
OPTIONS
请求查询服务器的性能,或者查询与资源相关的选项和需求
HTTP报文头
通用报文头
首部字段名 |
说明 |
Cache-Control |
控制缓存的行为 |
Connection |
逐跳首部、连接的管理 |
Date |
创建报文的日期时间 |
Pragma |
报文指令 |
Trailer |
报文末端的首部一览 |
Transfer-Encoding |
制定报文主体的传输编码方式 |
Upgrade |
升级为其他协议 |
Via |
代理服务器的相关信息 |
Warning |
错误通知 |
请求报文头
响应报文头
实体报文头
ACCEPT
作用:浏览器端可以接受的媒体类型
Accept:text/html. 代表浏览器可以接受服务器回发的类型为text/html也就是我们常说的html文档,如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(Non Acceptable)
Accept:*/* 代表浏览器可以处理所有类型
如果想要给显示的媒体类型增加优先级,则使用 q= 来额外标识权重值; 权重值 q 的范围是 0~1(可以精确到小数点后3位) , 且 1 位最大值。 不指定权重 q 值时,默认权重位 q=1.0。当服务器提供多种内容时,将会首先返回权重值最高的媒体类型.
Accept-Encoding
作用:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip, deflate)
Accept-Language
作用:浏览器申明自己接收的语言
客户端在服务器有中文版资源的情况下,会请求其返回中文版对应的响应,没有中文版时,则请求返回英文版的响应.
Connect
Connect:keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接.
Connect:close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,当客户端再次发送Request,需要重新建立TCP连接
Host
作用:请求报文域主要用于指定被请求资源的Intentnet主机和端口号,它通常从HTTP URL中提取出来
eg: 浏览器输入: http://www.fljf.com:8080
浏览器发送的请求信息中,就会包含Host请求包头域,如下: Host: www.fljf.com:8080
Referer
当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我时从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理
user-Agent
作用:告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本
很多情况下我们会通过User-Agent来判断浏览器类型,从而进行不同的兼容设计
Content-Type
作用:说明了报文体对象的媒体类型
eg:
text/html : HTML格式
text/plain : 纯文本格式
text/xml : XML格式
image/gif : gif图片格式
image/jpeg : jpg图片格式
image/png : png图片格式
application/xhtml_xml : XHTML格式
application : XML数据格式
application : Atom XML聚合格式
application /josn : JOSN数据格式
application/pdf : pdf格式
application/msword : Word文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)
application/x-www-form/urlencoded : 表单提交
HTTP报文结构分析-响应报文
HTTP请求方法剖析
HTTP
的八种请求方式:
-
GET
请求获取Request-URI
所标识的资源
-
POST
在Request-URI
所标识的资源后附加新的数据
-
HEAD
请求获取由Request-URI
所标识的资源的响应消息报头
-
PUT
请求服务器存储一个资源,并用Request-URI
作为其标识
-
DELETE
请求服务器删除Request-URI
所标识的资源
-
TRACE
请求服务器回送收到的请求信息,主要用于测试或诊断
-
CONNECT
保留将来使用
-
OPTIONS
请求查询服务器的性能,或者查询与资源相关的选项和需求
状态码
是用以表示服务器超文本传输协议响应状态的3位数字代码
HTTP状态码详解
分类 |
含义 |
1XX |
表示消息。这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。 |
2XX |
表示成功。这一类型的状态码,代表请求已成功被服务器接收、理解、并接受 |
3XX |
表示重定向。这类状态码需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的Location域中指明。 |
4XX |
表示请求错误。这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。除非响应的是一个HEAD请求,否则服务器就应该返回一个解释当前错误状况的实体,以及这是临时的还是永久的状况。这些状态码是用于任何请求方法。浏览器应当向用户显示任何包含在此类错误响应中的实体内容。 |
5XX |
表示服务器错误。这类状态码代表了服务器在吹请求的过程中有错误或者异常状态发生,也有可能是服务器意识到当前的软硬件资源无法完成对请求的处理。除非这是一个HEAD请求,否则服务器应当包含一个解释当前错误状态以及这个状况是临时的还是永久解释的信息实体。浏览器应当向用户展示任何在当前响应中被包含的实体。 |
一些常见的状态码:
200 OK
: 客户端请求成功;
202 Acceptd : 已接受,已经接受请求,但未处理完成.
206 : Partial Content : 部分内容,服务器成功处理了部分GET请求
301 Moved Permanently:代表永久性转移(示旧地址A的资源已经被永久地移除了)
302 Found :代表暂时性转移。 这两个都是重定向
400 Bad Request
: 客户端请求有语法错误,不能被服务器所理解;
401 Unauthorized
:请求未经授权,需要用户身份认证;
403 Forbidden
: 服务器收到请求,但是拒绝提供服;
404 Not Found
: 请求资源不存在;
500 Internal Server Error
: 服务器发生不可预期的错误;
503 Server Unavailable
:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
重定向和转发的区别
一句话,转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程:
转发过程:客户浏览器发送http请求 -> web服务器接受此请求 -> 调用内部的一个方法在容器内部完成请求处理和转发动作 -> 将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
重定向过程:客户浏览器发送http请求 -> web服务器接受后发送302状态码响应及对应新的location给客户浏览器 -> 客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址 -> 服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
HTTP状态管理:Cookie与Session
Cookie
- Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就向客户端浏览器颁发一个Cookie.
- 客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器检查该Cookie,以此来辨认用户状态.
工作原理
Session
Session是另一种记录客户状态的机制,保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。
工作原理
保存SessionID的方式
- Cookie
- URL重写
- Eg: http://xxx;SessionId-ByOK3vjFFD75.....
- 隐藏表单
Session有效期
- Session超时失效
- 程序调用HttpSession.invalidate()
- 服务器进程停止
Cookie与Session
- Cookie存放在客户端,Session存放在服务器
- 安全性不同
- 有效期不同,Session有有效期
- 对服务器压力的不同,Cookie在客户端,不会太多对服务器压力。Session过多对服务带来较大压力