HTTP(Hyper-Text Transfer Protocol,即超文本传输协议)位于应用层,是一个基于请求-响应模式的无状态协议,通常运行于TCP之上。
GET
,POST
,PUT
等;Content-Type
标记数据类型;注:HTTP 1.1相较于HTTP 1.0,最大的特点是引入了Keep-Alive机制。
客户端向服务器发送的HTTP请求报文由请求行、请求头部、空行和请求数据四部分组成。
请求数据只有在请求方法为POST
的时候才会被用到,表示要上传的数据。
空行用来标识请求头部是否结束,因而无论是否存在请求数据,请求头部后的空行都是必须的。
服务器向客户端返回的HTTP响应报文由状态行、响应头部、空行和响应正文四部分组成。
1XX
状态码 | 状态码描述 | 解释及注意事项 |
---|---|---|
2XX
状态码 | 状态码描述 | 解释及注意事项 |
---|---|---|
200 | OK | 正常返回消息 |
3XX
状态码 | 状态码描述 | 解释及注意事项 |
---|---|---|
4XX
状态码 | 状态码描述 | 解释及注意事项 |
---|---|---|
400 | Bad Request | 客户端请求有语法错误,不能被服务器所理解 |
401 | Unauthorized | 请求未经认证,这个状态码必须和WWW-Authenticate报头域一起使用 |
403 | Forbidden | 服务器能够正确理解请求,但是拒绝提供服务,该请求不会重发给服务器 |
404 | Not Found | 请求资源不存在,eg. 输入了错误的URL |
401和403有什么区别?
401 Unauthorized:表示认证错误,是为了认证设计,而不是为了授权设计的。收到401响应,表示请求没有被认证——压根没有认证或者认证不正确——但是得重新认证和重试(一般在响应头包含一个WWW-Authenticate报头域来描述如何认证)。通常由Web服务器返回,而不是Web应用。从性质上来说是临时的东西。
403 Forbidden:是关于授权方面的。**收到403响应,表示服务器完成认证过程,但是客户端请求没有权限去访问要求的资源。**从性质上来说是永久的东西,和应用的业务逻辑相关联。比401更具体,更实际。
总的来说,401 Unauthorized响应应该用来表示认证缺失或者错误,如账号密码错误;403 Forbidden用于认证之后,但是用户没有授权在特定资源上执行操作,即权限不够,如IP被禁。
参考:
5XX
状态码 | 状态码描述 | 解释及注意事项 |
---|---|---|
500 | Internal Server Error | 服务器发生了不可预期的错误,需要根据日志定位服务器出错位置 |
503 | Server Unavailable | 服务器当前不能处理客户端的请求,一段时间后可能恢复正常,如TCP连接池已满 |
客户端请求
GET /hello.txt HTTP/1.1\r\n
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3\r\n
Host: www.example.com\r\n
Accept-Language: en, mi\r\n
\r\n
服务器响应
HTTP/1.1 200 OK\r\n
Date: Mon, 27 Jul 2009 12:28:53 GMT\r\n
Server: Apache\r\n
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT\r\n
ETag: "34aa387-d-1568eb00"\r\n
Accept-Ranges: bytes\r\n
Content-Length: 51\r\n
Vary: Accept-Encoding\r\n
Content-Type: text/plain\r\n
\r\n
Response Text
注:5,6两步可以认为是同时发生的!
200、400/401/403、500/503
从三个方面来解答:
?
隔开,请求信息以key=value
的形式存在,同时请求信息之间以;
分隔),POST将请求信息放在请求体中,要获得POST请求信息必须解析请求体(解析报文非常容易,所以二者安全性并没有什么差别);因为GET请求是幂等的、安全的,所以可以被浏览器或CDN缓存下来,而POST请求必须交由服务器验证。
HTTP协议是无状态的,所以每次访问有认证需求的资源时,都必须携带认证信息进行认证。
而引入Cookie和Session,可以让HTTP从某种意义上来说具有状态。
Cookie是由服务器发给客户端的特殊信息,以文本的形式存放在客户端,当客户端向服务器发送请求的时候,都会带上这些信息:
当用户访问一个支持Cookie(如请记住我)的网站时,在用户将用户名、密码等个人信息提交给服务器后,服务器在响应时也会将这些信息(Cookie)放在响应头(response head)中返回;
当客户端浏览器接收到来自服务器的响应时,浏览器会将这些信息存放在一个统一的位置;
当客户端再次请求时,会将这些Cookie放在请求头(request head)中进行访问;
服务器接收到请求后,会解析Cookie动态生成与客户端相对应的内容。
Session是一种服务端机制,存储于服务器上。当客户端向服务器为建立会话发起请求时,服务器会检查请求头中是否已包含JSESSIONID的标识,如果已包含则说明服务器与该客户端已经建立了session,服务器则会根据这个JSESSIONID检索出对应的session,如果检索不到,则再新建一个新的session,如果不包含JSESSIONID则会为该会话请求创建一个session,并匹配一个随机且唯一JSESSIONID,然后将该JSESSIONID回发给客户端。
Session有两种实现方式:
服务器将在返回给浏览器的所有链接中都携带JSESSION的参数,这样点击任何一个链接,都会将JSESSIONID带回浏览器。
如果服务器发现客户端支持Cookie,则继续使用Cookie,停止使用URL回写,如果发现Cookie被禁用,则一直使用URL回写。
二者的区别: