HTTP常见知识点之——最常见的请求头及Http缓存(浏览器缓存)和应用程序缓存

1.Accept:浏览器可接受的MIME类型。MIME 类型有很多种, 例如:

 Accept:text/html,表明客户端希望接受 HTML 文本。
 
 Accept:image/gif,表明客户端希望接受 GIF 图像格式的资源。
 
 Accept:image/*,表明客户端可以接受所有image格式的子类型。
 
 Accept:*/*,表明客户端可以接受所有格式的内容。

例如,如果浏览器和服务器同时支持 png 类型的图片,则浏览器可以发送包含 image/png 的 Accept 的头字段,服务器检查到 Accept 头中包含 image/png 这种 MIME 类型,可能在网页中的 img 元素中使用 png 类型的文件

2.Accept-Charset: 浏览器可接受的字符集

Accept-Charset:UTF-8,ISO-8859-1


需要注意的是,

  • 如果 Accept-Charset 头字段没有在请求头中出现,则说明客户端能接受使用任何字符集的数据。
  • 如果 Accept-Charset 头出现在请求消息里,但是服务器不能发送采用客户端期望字符集编码的文档,那么服务器将发送一个 406 错误状态响应,406 是一个响应状态码,表示服务器返回内容使用的字符集与Accept-Charset头字段指定的值不兼容。

3.Accept-Encoding: 浏览器能够进行解码的数据编码方式。这里的编码方式通常指的是某种压缩方式。

Accept-Encoding:gzip,compress


在上面的头字段中,gzipcompress 这两种格式是最常见的数据编码方式。在传输较大实体的内容之前,对其进行压缩编码,可以节省网络带宽和传输时间。服务器接收到这个请求头,它使用其中指定的一种格式对原始文档内容进行压缩编码,然后再将其作为响应消息的实体内容发送给客户端,并且在 Content-Encoding 响应头中指出实体内容所使用的压缩编码格式。浏览器在接收到这样的实体内容之后,需要对其进行反向解压缩。

需要注意的是,Accept-Encoding 和 Accept 消息头不同,Accept 请求头指定的 MIME 类型是指解压后的实体内容类型,Accept-Encoding 消息头指定的是实体内容压缩的方式。。

4.Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。

5.Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。

6.Connection:表示是否需要持久连接。

7.Content-Length:表示请求消息正文的长度。

8.Cookie:这是最重要的请求头信息之一

9.From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。

10.Host:初始URL中的主机和端口。

11.If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答。

12.Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。

13.Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。

14.User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。

15.UA-PixelsUA-ColorUA-OSUA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。

百度百科:https://baike.baidu.com/item/http%E8%AF%B7%E6%B1%82%E5%A4%B4/6623287?fr=aladdin


应用程序缓存

应用程序缓存是 HTML5 的重要特性之一,提供了离线使用的功能,让应用程序可以获取本地的网站内容,例如 HTML 、 CSS 、图片以及 JavaScript 。这个特性可以提高网站性能,它的实现借助于 manifest 文件,如下:



<html manifest=”example.appcache”>

html>

与传统浏览器缓存相比,它不强制用户访问的网站内容被缓存
优点:

  • 提供离线缓存,离线时可以使用,
  • 加载速度快,提高了网页的性能,
  • 减少服务器负载:浏览器只从服务器下载更新的或者更改过的资源

HTTP缓存浏览器缓存

  浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的。

 浏览器和服务器进行Http通信时发送的数据即为Http报文,其中分为两部分:

  • header - 报文的首部或头部,其中保存着各类请求的属性字段,关于Http的缓存相关规则信息均保存在header中
  • body - 请求体部分,Http请求真正传输的主体部分

  Http缓存主要分为两种:强缓存协商缓存,根据响应的header内容来决定

获取资源形式 状态码 发送请求到服务器
强缓存 从缓存取 200(from cache) 否,直接从缓存取
协商缓存 从缓存取 304(not modified) 是,通过服务器来告知缓存是否可用

强缓存(时效缓存)

  强缓存相关字段有expirescache-control。如果cache-controlexpires同时存在的话,cache-control的优先级高于expires, 即:cache-control优先级比expires高。

控制强制缓存的字段分别有

1. expires: 表示未来资源会过期的时间
  即当发起请求的时间超过了 expires 设定的时间,会发送请求到服务器重新获取资源。

2. cache-control: 取值有五种, 如下:

  • private:客户端可以缓存(默认值)
  • public:客户端和代理服务器均可缓存;
  • max-age=xxx:缓存的资源将在 xxx 秒后过期;
  • no-cache:需要使用协商缓存来验证是否过期;
  • no-store:不可缓存(所有内容都不会缓存,强制缓存,对比缓存都不会触发)

协商缓存(非时效缓存)

协商缓存相关字段有Last-Modified/If-Modified-SinceEtag/If-None-Match

1)在http 1.0版本中,第一次请求,服务器通过 Last-Modified 来设置响应头的缓存标识,并且把资源最后修改的时间作为值填入,然后将资源返回给浏览器。

在第二次请求时,浏览器会首先带上 If-Modified-Since 请求头去访问服务器,服务器会将 If-Modified-Since 中携带的时间与资源修改的时间匹配。

  • 时间不一致,服务器返回新资源,且将Last-Modified值更新,作为响应头返回给浏览器。
  • 时间一致,表示资源没有更新,服务器返回304状态码,浏览器读取缓存资源。

2)在 http 1.1 版本中,在第一次请求时,服务器通过 Etag 来设置响应头缓存标识,并将资源和 Etag 一并返回给浏览器,浏览器缓存到本地。

在第二次请求时,浏览器会将 Etag 信息放到 If-None-Match 请求头去访问服务器,服务器收到请求后,会将服务器中的文件标识与浏览器发来的标识进行对比,

  • 不相同,服务器返回更新资源和新Etag.
  • 相同,服务器返回 304 ,浏览器读取缓存。

注:弊端,就是当服务器中的资源增加了一个字符,后来又把这个字符删掉,本身资源文件并没有发生变化,但修改时间发生了变化。当下次请求过来时,服务器也会把这个本来没有变化的资源重新返回给浏览器。

总结:强制缓存优先于协商缓存进行,若强制缓存(Expires和Cache-Control)生效则直接使用缓存,若不生效则进行协商缓存(Last-Modified / If-Modified-Since和Etag / If-None-Match),协商缓存由服务器决定是否使用缓存,若协商缓存失效,那么代表该请求的缓存失效,重新获取请求结果,再存入浏览器缓存中;生效则返回304,继续使用缓存

参考于:

  • https://blog.csdn.net/jutal_ljt/article/details/80021545
  • https://www.cnblogs.com/renzm0318/p/11073881.html

你可能感兴趣的:(前端,学习总结)