你知道304吗?图解强缓存和协商缓存

http协议—常见状态码,请求方法,http头部,http缓存

  • 一、http状态码
    • 1、引例阐述
    • 2、状态码分类
    • 3、常见状态码
    • 4、关于协议和规范
  • 二、http 方法
    • 1、传统的methods
    • 2、现在的methods
    • 3、Restful API
      • (1)Restful API是什么?
      • (2)如何设计成一个资源?
  • 三、http 头部(http headers)
    • 1、常见的Request headers
    • 2、常见的Response headers
  • 四、http 缓存
    • 1、关于缓存的介绍
      • (1)什么是缓存
      • (2)为什么需要缓存?
      • (3)哪些资源可以被缓存?——静态资源(js、css、img)
    • 2、http 缓存策略(强制缓存 + 协商缓存)
      • (1)强制缓存
        • 1)强制缓存是什么?
        • 2)图例
        • 3)Cache-Control
        • 4)关于Expires
      • (2)协商缓存
    • 3、刷新操作方式,对缓存的影响
      • (1)正常操作
      • (2)手动刷新
      • (3)强制刷新
  • 五、写在最后

http 对于一个前端工程师来说,是非常需要了解的一个知识点,贯穿于整个前端开发的过程。如果说一个前端工程师不知道 http ,或者说是了解甚少,那他肯定不是一个合格的工程师。那么,http 对于去前端来说,有什么用呢?

  • 前端工程师在开发界面时,需要用到 http 协议;
  • 前端在调用后端的接口时,提交(post)或者获取(get)数据时,需要用到 http 协议;
  • ……

下面将从多个方面讲解 http 协议。

一、http状态码

1、引例阐述

在讲状态吗之前,我们先来了解什么是状态码。比如百度网站:

百度状态码

大家可以看到,上图中圈红圈的部分就是 http 的状态码,常见的状态码有200,400,404等等。接下来对状态码的一些基础知识进行介绍。

2、状态码分类

下表给出状态码分类。

状态码含义解释说明
1xx服务器收到请求收到1xx开头的请求表示服务端已经收到请求,但是还没有返回信息给客户端
2xx请求成功,如200表示客户端已经成功请求数据
3xx重定向,如302客户端收到3xx开头的状态码时,表示此时服务端已经不再管客户端所请求地址,让客户端去请求另外的地址
4xx客户端错误,404表示当客户端请求了一个服务端完全不认识的地址时,就会报出4xx的错误
5xx服务端错误,如500表示此错误来源于服务端,比如服务端写的接口出现了bug等问题

3、常见状态码

常见的有200(正常) 、404(无法找到该网页资源) 、304(跳转页面) 、500(服务器错误)等,具体如下:

状态码含义用途
200OK 成功一般用于 GET 和 POST 请求
301Redirect Permanently 永久重定向配合location,浏览器自动处理
302Found 临时重定向配合location,浏览器自动处理
304Not Modified 资源未被修改所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
404Not Found 资源未找到服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站 设计人员可设置"您所请求的资源无法找到"的个性页面
403Forbidden 没有权限服务器理解请求客户端的请求,但是拒绝执行此请求
500Internal server Error 服务器错误服务器内部错误
504Gateway Time-out网关超时充当网关或代理的服务器,未及时从远端服务器获取请求

下面详细阐述 301302

301 永久重定向:

常见场景有,比如说你的一个网站,域名到期了,或者域名你不想用了,那么老的域名就可以返回一个301状态码并配合location让location的值等于新的域名,最终进行跳转,之后浏览器会记住新的域名,不会再访问老的域名。

302 临时重定向:

常见场景有百度,知乎、简书等等。比如说我们要在百度进入菜鸟教程,搜索出来后有一系列的列表,我们可以选择一个去进行一个点击。点击的那个不会直接进入菜鸟教程,而是先跳转到百度设置的一个临时地址,之后再跳转到菜鸟教程真实的地址。

4、关于协议和规范

  • http协议就是一个约定,一个规范,要求大家都跟着执行;
  • 因此不要做违规范的事情,例如 IE 浏览器,违反规范终将会落下被历史淘汰的局面。

二、http 方法

1、传统的methods

  • get 获取服务器的数据;
  • post 向服务器提交数据;
  • head 用户获取报头。

2、现在的methods

  • get 获取数据;
  • post 新建数据;
  • patch/put 更新数据;
  • delete 删除数据;
  • head,类似于get请求,只不过返回的响应中没有具体的内容,用户获取报头;
  • options,允许客户端查看服务器的性能,比如说服务器支持的请求方式等等;
  • trace,追踪路径;
  • connect,要求用隧道协议连接代理。

3、Restful API

(1)Restful API是什么?

  • Restful API 是一种新的 API 设计方法(早已推广使用)。

  • 传统 API 设计:把每个 url 当做一个功能。

  • Restful API 设计:把每个 url 当做一个唯一的资源。

(2)如何设计成一个资源?

1)尽量不用url参数

  • 传统 API 设计:/api/list?pageIndex=2
  • Restful API 设计:/api/list/2

2)用method表示操作类型

传统 API 设计:

  • post请求:/api/create-article

  • post请求:/api/update-article?id=100

  • get请求:/api/get-article?id=100

Restful API 设计:

  • post请求:/api/article

  • post请求:/api/article/100

  • get请求:/api/article/100

三、http 头部(http headers)

1、常见的Request headers

请求头含义
Accept浏览器可接收的数据格式
Accept-Encoding浏览器可以接收的算法,如gzip
Accept-Language浏览器可接收的语言,如zh-CN
Connectionkeep-alive 一次TCP连接重复使用
cookie客户端接收到的Cookie信息
Host指定原始的 URL 中的主机和端口
User-Agent(简称UA)浏览器内核信息
Content-type发送数据的格式,如application/json

2、常见的Response headers

响应头含义
Content-type返回数据的格式,如application/json
Content-length返回数据的大小,多少字节
Content-Encoding返回数据的压缩算法,如gzip
Set-Cookie服务端向客户端设置cookie

四、http 缓存

1、关于缓存的介绍

(1)什么是缓存

缓存是一种保存资源副本并在下次请求时直接使用该副本的技术。

(2)为什么需要缓存?

如果没有缓存的话,每一次网络请求都要加载大量的图片和资源,这会使页面的加载变慢许多。那缓存的目的其实就是为了尽量减少网络请求的体积和数量,让页面加载的更快。

(3)哪些资源可以被缓存?——静态资源(js、css、img)

  • 网站的 html 是不能被缓存的。因为网站在使用过程中 html 随时有可能被更新,随时有可能被替换模板。
  • 网页的业务数据也是不能被缓存的。比如留言板和评论区,用户随时都可以在底下评论,那数据库的内容就会被频繁被更新。

2、http 缓存策略(强制缓存 + 协商缓存)

(1)强制缓存

1)强制缓存是什么?

强制缓存就是文件直接从本地缓存中获取,不需要发送请求。

2)图例

先看第一个图。

强制缓存 图1

从上图可以看到,当初次请求时,浏览器会向服务器发起请求,服务器接收到浏览器的请求后,返回资源并返回一个 Cache-Control 给客户端,该 Cache-Control 一般设置缓存的最大过期时间。


接下来看第二个图。

强制缓存 图2

从上图中可以看到,此时浏览器已经接收到cache-control的值,那么这个时候浏览器再次发送请求时,它会先检查它的cache-control是否过期,如果没有过期则直接从本地缓存中拉取资源,返回到客户端,而无需再经过服务器。


接下来看第三个图。

强制缓存 图3

强制缓存有过期时间,那么就意味着总有一天缓存会失效。那么假设某一天,客户端的 cache-control 失效了,那么它就没办法从本地缓存中拉取资源。于是它会像第一张图一样,重新向服务器发起请求,之后服务器会再次返回资源和 cache-control 的值。

以上就是强制缓存的全过程。

3)Cache-Control

Cache-Control是什么?

  • 存在于响应头Response Headers中;
  • 控制强制缓存的逻辑;
  • 例如:Cache-Control: max-age = 31536000(单位是秒)。

Cache-Control的值

Cache-Control值含义
max-age设置缓存的最大过期时间
no-cache不用本地缓存,正常的向服务端请求,服务端怎么处理我们不用管
no-store简单粗暴,直接从服务端拉取缓存
private只能允许最终用户做缓存,最终用户即电脑、手机等等
public允许中间路由或中间代理做缓存

4)关于Expires

  • 同在 Response Headers
  • 同为控制缓存的过期时间(早期使用)
  • 如果 cache-control 与 expires 同时存在的话, cache-control 的优先级高于 expires

(2)协商缓存

1)协商缓存是什么?

  • 协商缓存,也叫对比缓存。
  • 它是一种服务端的缓存策略,即通过服务端来判断某件事情是不是可以被缓存。
  • 服务端判断客户端的资源,是否和服务端资源一样,如果一致则返回 304 ,反之返回 200 和最新的资源。

2)图例

同样地,用几张图来演示协商缓存。

先来看第一张图。

协商缓存 图1

在上图中,表明了协商缓存的全过程。首先,如果客户端是第一次向服务器发出请求,则服务器返回资源和相对应的资源标识给浏览器。该资源标识就是对当前所返回资源的一种唯一标识,可以是Etag或者是Last-Modified,这两个字段将在图例结束后展开讲解。

之后如果浏览器再次发送请求时,浏览器就会带上这个资源标识。此时,服务端就会通过这个资源标识,可以判断出浏览器的资源跟服务端此时的资源是否一致,如果一致,则返回304,即表示Not Found 资源未修改。如果判断结果为不一致,则返回200,并返回资源以及新的资源标识。至此就结束了协商缓存的过程。


接下来看第二张图。

协商缓存 图2

假设此时我们的协商缓存用 Last-Modified 来判断。当浏览器第一次发送请求时,服务器返回资源并返回一个 Last-Modified 的值给浏览器。这个 Last-Modified 的值给到浏览器之后,浏览器会通过 If-Modified-Since 的字段来保存 Last-Modified 的值,且 If-Modified-Since 保存在请求头当中。

之后当浏览器再次发送请求时,请求头会带着 If-Modified-Since 的值去找服务器,服务器此刻就会匹配浏览器发过来的 If-Modified-Since 是否和自己最后一次修改的 Last-Modified 的值相等。如果相等,则返回 304 ,表示资源未被修改;如果不相等,则返回200,并返回资源和新的 Last-Modified 的值。


接下来看第三张图。

协商缓存 图3

假设此时我们的协商缓存用 Etag 来判断。当浏览器第一次发送请求时,服务器返回资源并返回一个 Etag 的值给浏览器。这个 Etag 的值给到浏览器之后,浏览器会通过 If-None-Match 的字段来保存 Etag 的值,且 If-None-Match 保存在请求头当中。

之后当浏览器再次发送请求时,请求头会带着 If-Modified-Since 的值去找服务器,服务器此刻就会匹配浏览器发过来的 If-None-Match 是否和自己最后一次修改的 Etag 的值相等。如果相等,则返回 304 ,表示资源未被修改;如果不相等,则返回 200 ,并返回资源和新的 Etag 的值。

通过图例,相信大家对协商缓存有了一个新的认识。接下来讲解刚刚图例中所包含的一些字段。

3)资源标识

在响应头部 Response Headers 中,有两种资源标识:

  • Last-Modified 资源的最后修改时间,对应请求头为 If-Modified-Since
  • Etag 资源的唯一标识,所谓唯一,可以想象成时人类的指纹,具有唯一性;但 Etag 的本质是一个字符串;对应请求头为 If-None-Match

4)Last-Modified 和 Etag

  • 当响应头部 Response Headers 同时存在 Last-ModifiedEtag 的值时,会优先使用 Etag
  • Last-Modified 只能精确到秒级;
  • 如果资源被重复生成,而内容不变,则 Etag 更精确。

5)Headers 示例

Headers 实例

由上图可以看到,响应头中的 Last-Modified 对应请求头中的 If-Modified-SinceEtag 对应请求头中的 If-None-Match

6)流程图

说到这里,协商缓存的内容也快结束啦!最后的最后,我们用一张流程图来展示协商缓存的全过程。
协商缓存流程图

3、刷新操作方式,对缓存的影响

讲完缓存,我们再来讲个有点重要但是有点题外话的内容:刷新操作。我们平常在上网时,总有某个时刻突然网卡了,这个时候人的本性总是非常不耐烦的,毫不犹豫的就来个刷新。但殊不知,刷新对缓存也存在一定的影响。下面我们一起来看下各种刷新姿势以及其对缓存的影响。

(1)正常操作

定义: 地址栏输入 url ,跳转链接,前进后退等。

对缓存的影响: 强制缓存有效,协商缓存有效。

(2)手动刷新

定义: F5 ,点击刷新按钮,右击菜单刷新。

对缓存的影响: 强制缓存失效,协商缓存有效。

(3)强制刷新

定义: ctrl + F5

对缓存的影响: 强制缓存失效,协商缓存失效。

这一块内容仅当娱乐补充,大家可以根据自身需求学习~

五、写在最后

http协议对于开发来说时很重要很重要的一块内容,不管时前端还是后端,对于常见的状态码,请求方法请求头和响应头,还有强缓存和协商缓存都是必须要了解的知识点。

关于http协议的知识就讲到这里啦!如有疑问或文章有讲的不好的地方欢迎评论区评论或私信我交流~

  • 关注公众号 星期一研究室 ,不定期分享学习干货

  • 如果这篇文章对你有用,记得点个赞加个关注再走哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308022.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode844. 比较含退格的字符串(栈+双指针)

一:题目 二:思路代码 1:利用栈 (1):思路 1.利用栈 我们将字符串中的单个元素都入栈 当遇到’#的时候将将栈顶元素弹出 (2):上码(方法一) class Solution { public:/**思路:1.利用栈 我们将字符串中的单个元素都入栈 当遇到#的时候将将栈顶元素弹出*…

efcore技巧贴-也许有你不知道的使用技巧

前言.net 环境近些年也算是稳步发展。在开发的过程中,与数据库打交道是必不可少的。早期的开发者都是DbHelper一撸到底,到现在的各种各样的ORM框架大行其道。孰优孰劣谁也说不清楚,文无第一武无第二说的就是这个理。没有什么最好的&#xff0…

关于前端性能优化问题,认识网页加载过程和防抖节流

前端性能优化—网页加载过程、性能优化方法、防抖和节流一、网页加载过程1、加载资源的形式2、加载资源的过程3、渲染页面的过程4、关于window.onload 和 DOMContentLoaded二、性能优化1、性能优化原则2、性能优化的方法3、让加载更快4、让渲染更快三、防抖和节流1、防抖 debou…

javax.net.ssl.SSLHandshakeException: No appropriate protocol

一:报错 二:解决 找到jdk 1.8安装目录,找到C:\Program Files\Java\jre里面的lib\security 下面有个java.security将jdk.tls.disabledAlgorithms后面的SSLv3, TLSv1, TLSv1.1都删除掉.(大概位置是在700多行) 三:上方并未解决的 我的jdk是这…

『软件工程9』结构化系统分析——解决软件“做什么”问题

结构化系统分析——解决软件“做什么”问题一、系统分析的任务和过程1、系统分析的任务2、系统分析的过程(1)问题识别(2)分析与综合(3)编制文档(4)系统分析评审二、结构化分析方法1、…

.NET5.0 Preview 8 开箱教程

.NET5.0 Preview 8 开箱教程前言首先,看到 .NET5.0 Preview 8 发布后,作为一枚基层应用开发人员,很想要体验一下新版本的魅力;这可能就是程序员对新技术的一种执着吧。其实从官方宣布 .NETCore 将更名为 .NET5 开始,我…

leetcode977. 有序数组的平方(暴力+双指针)

一:题目 二:暴力双指针 1:暴力 class Solution { public:vector<int> sortedSquares(vector<int>& nums) {vector<int> v;for(int num : nums){int temp pow(num,2);v.push_back(temp);} sort(v.begin(),v.end());return v;} };2:双指针 思路:1.利…

『软件工程10』结构化系统分析:数据流图和字典案例分析

结构化系统分析——数据流图和数据字典案例分析一、数据流图案例分析1、案例1&#xff1a;商店业务管理系统2、案例2&#xff1a;学籍管理系统3、案例3&#xff1a;大型企业数据中心二、数据字典案例分析1、案例1&#xff1a;学籍管理系统三、写在最后接 上一篇文章的内容&…

MongoDB最新4.2.7版本三分片集群修改IP实操演练

背景重新组网&#xff0c;需要对现有MongoDB分片集群服务器的IP进行更改&#xff0c;因此也需要对MongoDB分片集群的IP也进行相应的更新&#xff0c;而MongoDB分片集群的IP修改不能单纯的通过配置来进行&#xff0c;需要一番折腾后才能正常更新&#xff0c;这里对整个MongoDB集…

浅谈Web前端安全策略xss和csrf,及又该如何预防?

Web前端安全策略xss和csrf的攻击和防御一、XSS跨站请求攻击1、什么是XSS2、场景模拟3、XSS的攻击类型4、如何防御XSS二、XSRF跨站请求伪造1、什么是csrf2、场景模拟&#xff08;1&#xff09;场景一&#xff08;2&#xff09;场景二3、CSRF的特点4、CSRF攻击方式5、CSRF常见的攻…

leetcode209. 长度最小的子数组(暴力+滑动窗口)

一:题目 二:暴力滑动窗口 1:暴力解法 class Solution { public:int min (int a ,int b){return a < b ? a : b;}int minSubArrayLen(int target, vector<int>& nums) {int minx 100001;for(int i 0; i < nums.size(); i){vector<int> v;int sum nu…

做权限认证,还不了解IdentityServer4?不二话,赶紧拥抱吧,.NET Core官方推荐!...

目前大多数的应用程序或多或少看起来是上图所示这样的&#xff0c;最常见的交互场景有&#xff08;浏览器与Web应用程序、Web应用程序与WebApi通讯、本地应用程序狱WebApi通讯、基于浏览器的应用程序与WebApi 通讯、基本服务器的应用程序与WebApi通讯、WebApi与WebApi通讯&…

leetcode 904:水果成篮(滑动窗口)

一:题目 二:思路 1.用两个篮子装进两个数&#xff0c;后面只能装入这两个相同的数,并统计个数;如果遇到其他数,则重新开始计数&#xff0c; 这里的重新开始计数指的是在去除第一个篮子中所装进的数 2.滑动窗口来做 滑动窗口的起始位置为:数组的起始位置 滑动体为 统计的个数 滑…

真・WPF 按钮拖动和调整大小

真・WPF 按钮拖动和调整大小独立观察员 2020 年 8 月 29 日手头有个 Winform 程序&#xff0c;是使用动态生成按钮&#xff0c;然后拖动、调整大小&#xff0c;以此来记录一些坐标数据&#xff0c;最后保存坐标数据的。在数据量&#xff08;按钮数量&#xff09;比较小的时候是…

『软件工程11』结构化系统设计:解决软件“怎么做”问题

结构化系统设计——解决软件“做什么”问题一、设计的目标和任务1、目标2、任务3、开发阶段的信息流4、软件设计的重要性5、软件设计的技术观点和管理观点二、设计基础1、结构图&#xff08;体系结构图、模块结构图&#xff09;&#xff08;1&#xff09;分析结构图三者间的关系…

map容器中删除一个元素(value)

一:问题描述 我们想要删除map容器中&#xff0c;一个key值对应的vlaue 二&#xff1a;上码 #include<iostream> #include<map> #include<vector> using namespace std; int main(){map<int,int> m;for(int i 0; i < 4; i){m[i] i1;}//正常输出 …

.Net5发布在即,当心技术断层!

就在上周&#xff0c;.NET5的最后一个预览版&#xff0c;.NET5 Preview.8发布了&#xff0c;更新内容只有几个小bug的修复&#xff0c;已完成.NET5正式版的最后准备&#xff0c;.NET5即将正式面世&#xff01;时光荏苒&#xff0c;回首2016年发布.NET Core1.0至今&#xff0c;已…

『软件测试4』耗子尾汁!2021年了,你还不知道这4种白盒测试方法吗?

软件测试——详解白盒测试基本概念&#xff0c;四种白盒测试方法一、白盒测试基本概念1、白盒测试的定义2、白盒测试的测试对象3、白盒测试的原则4、白盒测试的分类二、静态白盒测试1、代码检查法&#xff08;1&#xff09;代码审查的定义&#xff08;2&#xff09;代码审查的目…

leetcode76:最小覆盖字串(滑动窗口)

一&#xff1a;题目 二:思路 思路拿别人的&#xff0c;感觉写的很nice!! 渣渣杰只能膜拜大佬的了 1.滑动窗口的思想&#xff1a; left 指针和 ring 指针&#xff0c;保证两个指针之间的字符串包含所需要的全部字符。 2在保证 1 的前提下&#xff0c; 向右移动 left&#x…

Orleans 知多少 | Orleans 中文文档上线

Orleans 简介Orleans是一个跨平台框架&#xff0c;用于构建健壮&#xff0c;可扩展的分布式应用程序Orleans建立在.NET开发人员生产力的基础上&#xff0c;并将其带入了分布式应用程序的世界&#xff0c;例如云服务。Orleans可从单个本地服务器扩展到云中全局分布的高可用性应用…