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:服务器错误状态码,服务器处理请求出错

本文到这里就结束啦~

相关推荐
Daniel 大东38 分钟前
BugJson因为json格式问题OOM怎么办
java·安全
Theodore_10225 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸6 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象6 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了7 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·7 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic7 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王7 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康7 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神8 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式