JavaEE: 深入解析HTTP协议的奥秘(3)

文章目录

  • HTTP
    • [认识 "报头"(Header)](#认识 "报头"(Header))
    • [认识 "状态码"(status code)](#认识 "状态码"(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:服务器错误状态码,服务器处理请求出错

本文到这里就结束啦~

相关推荐
考虑考虑8 小时前
Jpa使用union all
java·spring boot·后端
用户3721574261358 小时前
Java 实现 Excel 与 TXT 文本高效互转
java
浮游本尊9 小时前
Java学习第22天 - 云原生与容器化
java
渣哥11 小时前
原来 Java 里线程安全集合有这么多种
java
间彧11 小时前
Spring Boot集成Spring Security完整指南
java
间彧11 小时前
Spring Secutiy基本原理及工作流程
java
Java水解12 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆14 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学15 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole15 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端