JavaEE: 深入解析HTTP协议的奥秘(3)
文章目录
- HTTP
- 认识 "报头"(Header)
- 认识 "状态码"(status code)
HTTP
JavaEE: 深入解析HTTP协议的奥秘(2)
书接上文~
认识 “报头”(Header)
Header 的整体的格式是"键值对"结构.
每个键值对占一行,键和值之间使用分号分隔.
-
Host 表示服务器主机的地址和端口.
-
Content-Length 表示 Body 中的长度.单位是字节.
Content-Length 告诉我们,这一个 HTTP 数据报到哪里就结束了.
HTTP 基于 TCP,TCP 是面向字节流的,存在粘包问题.
如何解决粘包问题:
1. 指定分隔符. 如果一个 HTTP 数据报没有 Body ,此时空行就相当于分隔符了.
2. 指定数据报长度. 如果一个 HTTP 数据报有 Body ,此时 Content-Length 就描述了 Body 的长度. -
Content-Type 表示请求的 Body 中的数据格式.浏览器会根据这个格式来决定如何解析数据.
Content-Type 和 Content-Length都属于是在 请求 和 响应 中都会存在的.
Content-Type 的详细情况 -
User-Agent (简称 UA) 表示浏览器/操作系统的属性.
在以前 UA 的意义更大.
当年的上网设备,进化速度非常快,同一时刻,会有很多种不同的设备都在被各种用户使用.这对网站的开发人员,带来了一定挑战.
如果网站只支持文字图片,在用好设备的人的眼里,就太 low 了.
如果网站能够支持复杂多媒体,在用不好的设备的人眼里,压根就无法正确显示.解决方案: 同时开发出多个不同版本的页面(有的只有文字图片,有的包含复杂多媒体),判断 UA 字段,通过 UA 获取到用户的浏览器信息和操作系统信息,这样就可以判定当前用户的浏览器版本都支持哪些特性,从而展示对应的页面.
在今天,虽然浏览器大家都差不多,但是上网的设备还是存在差别(PC / 手机 , 屏幕尺寸(比例)是截然不同的).
为了解决上述问题,我们仍然可以通过 UA 来切入.但是这个方案不是特别理想,你想象一下,除了PC和手机外,还有平板~平板的 UA 看起来和手机一样,而且使用平板的时候,不同的人的使用习惯不同.有的人是横屏使用,有的人是竖屏使用~
针对上述问题,在前端开发圈子里,研究出了个东西"响应式编程",在前端代码中(主要是 CSS ),能够自动查询出当前屏幕的尺寸,并结合尺寸对页面自动进行重新排版.
UA 现在还有一个作用,就是用来做数据统计.
比如说一天有多少广告被展示,多少被点击,哪些广告点击率高~
根据统计结果,进一步的迭代改进产品.
UA 的统计主要是用来区分 PC 和移动端的,有多少人通过 PC 访问,又有多少人通过移动端访问.User-Agent 的故事
-
Referer 表示这个页面是从哪个页面跳转过来的.
-
Cookie
Cookie 也是键值对结构,使用 ; 来分隔键值对,使用 = 来分隔键和值.键值对的含义都是程序员自定义的.
Cookie 是浏览器本地持久化存储数据的一种机制,按照键值对方式存储,键值对的内容都是程序员自定义的,按照域名为维度分别进行存储(每个网站有自己的 Cookie, 但相互不影响)
为了安全,浏览器禁止网页直接访问你的硬盘.(文件系统)
万一你打开某个网站,结果你电脑上所有的文件都被删除了…虽然不能直浏览器禁止网页接访问硬盘,但是浏览器允许通过键值对的方式来存储数据(这样的数据本质上也是在硬盘上),具体这样的键值对是如何存储到硬盘上的,浏览器封装好,网页本身无法干预.
这样的一个机制,就是 Cookie.Cookie 里面的内容也是来自于服务器,首次访问某个网站,可能是不带 Cookie 的,在响应中就会有 Set-Cookie 这样的 Header, 把一些键值对写回到浏览器这边.浏览器后续访问这个网站就会带有 Cookie ~
有一个 Cookie 非常经典的使用场景 — 使用 Cookie 保存用户的身份信息.
对于 HTTP 来说,针对同一个服务器,每一次的 HTTP 请求彼此之间都是独立的.
登录前是一个请求,后续的请求是如何知道我处于登录状态呢?
更简洁一点的图:
认识 “状态码”(status code)
状态码表示访问一个页面的结果.(是访问成功,还是失败,还是其他的一些情况…)
以下为常见的状态码:
- 200 表示访问成功.
- 404 Not Found 没有找到资源.
- 403 Forbidden 表示访问被拒绝.
- 405 Method Not Allowed
- 500 Internal Server Error 服务器出现内部错误.
- 504 Gateway Timeout
当服务器载荷比较大的时候,服务器处理单挑请求的时候消耗的时间就会很长,就可能会导致出现超时的情况. - 302 Move temporarily 临时重定向.
访问 A 网站,自动跳转到 B 网站.举个例子: 我要换手机号码 A -> B.
我的朋友同学都是存了 A ,不知道 B.
只需要我办理呼叫转移,那么有人给 A 打电话就会自动转接到 B 上~
小知识:
- 1xx:信息状态码,接受到请求正在处理
- 2xx:成功状态码,请求正常处理完毕
- 3xx:重定向状态码,需要进行附加操作来完成请求
- 4xx:客户端错误状态码,服务器无法处理请求
- 5xx:服务器错误状态码,服务器处理请求出错
下一篇文章: JavaEE: HTTPS的魅力与优势揭秘
本文到这里就结束啦~