HTTP
概念:http是基于TCP协议的一个无状态协议(超文本传输协议)
** 请求组成部分 ** * 请求方法 URL HTTP/版本号 * 请求首部字段(可选) * 空行 * body(只对Post请求有效)
** 响应组成部分 ** * HTTP/版本号 返回码 返回码描述 * 应答首部字段(可选) * 空行 * body
** 优缺点 **
- http是无状态的协议,每次请求不会记录
- 单一方向,每次需要客户端发出http请求,服务器通过http返回消息
HTTP版本
* HTTP1.0
* HTTP1.1
* HTTP2.0
HTTP缓存机制
Web 缓存大致可以分为:数据库缓存、服务器端缓存(代理服务器缓存、CDN 缓存)、浏览器缓存。
浏览器缓存也包含很多内容: HTTP 缓存、indexDB、cookie、localstorage 等等。这里我们只讨论 HTTP 缓存相关内容。
Http缓存机制作为 web 性能优化的重要手段
我们知道HTTP的缓存属于客户端缓存,后面会提到为什么属于客户端缓存。所以我们认为浏览器存在一个缓存数据库,用于储存一些不经常变化的静态文件(图片、css、js等)。我们将缓存分为 强制缓存 和 协商缓存。下面我将分别详细的介绍这两种缓存的缓存规则。
浏览器加载一个页面的简单浏览表现!!!
浏览器先根据这个资源的 http头信息 来判断是否命中 强缓存。如果命中则直接加在缓存中的资源,并不会将请求发送到服务器。如果未命中强缓存,则浏览器会将资源加载请求发送到服务器。服务器来判断浏览器 本地缓存是否失效。若可以使用,则服务器并不会返回资源信息,浏览器继续从缓存加载资源。如果未命中协商缓存,则服务器会将完整的资源返回给浏览器,浏览器加载新资源,并更新缓存。
强制缓存
当缓存数据库中已有所请求的数据时。客户端直接从缓存数据库中获取数据。当缓存数据库中没有所请求的数据时,客户端的才会从服务端获取数据。
对于强制缓存来说,响应的header会有两个字段来标明失效规则Expires | Cache-Control
-
Expires的值为服务器返回的到期时间,即下一次请求时,请求时间小于服务器返回的到期时间,直接使用缓存数据 注: Expires到期时间有服务器生成,也是HTTP1.0环境,基本不怎么用。现在大部分请求都是HTTP1.1, 使用
Cache-Control -
Cache-Control 是最重要的规则,常用值有
private、public、no-cache、max-age、no-store、must-revalidate默认是private
- private: 客户端可以缓存
- public: 客户端和代理服务器都可缓存
- max-age=xxx 缓存的内将在XXX秒失效
- no-cache: 需要使用对比缓存来验证缓存数据
- no-store: 所有内容都不会缓存
- must-revalidate 资源过期后必须重新校验
已spring spoot为例, 返回的response添加头部信息
response.setHeader(HttpHeaders.CACHE_CONTROL, "public max-age:7200, must-revalidate");
协商缓存
又称对比缓存,客户端会先从缓存数据库中获取到一个缓存数据的标识,得到标识后请求服务端验证是否失效(新鲜),如果没有失效服务端会返回304,此时客户端直接从缓存中获取所请求的数据,如果标识失效,服务端会返回更新后的数据。
对于协商缓存来说,缓存标识的传递是我们着重需要理解的,它在请求header和响应header间进行传递, 一共分为两种标识传递,接下来,我们分开介绍
1.Last-Modified : 服务器在响应请求时,告诉浏览器资源的最后请求时间
2.If-Modified-Since 再次请求服务器时,通过此字段通知服务器上次请求时,服务器返回的资源最后修改时间。 服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。 若资源的最后修改时间大于If-Modified-Since,说明资源又被改动过,则响应整片资源内容,返回状态码200; 若资源的最后修改时间小于或等于If-Modified-Since,说明资源无新修改,则响应HTTP 304,告知浏览器继续使用所保存的cache。
缓存优势
- 减少了冗余的数据传递,节省宽带流量
- 减少了服务器的负担,大大提高了网站性能
- 加快了客户端加载网页的速度 这也正是HTTP缓存属于客户端缓存的原因。
不同操作请求过程
* 浏览器输入url回车请求资源,浏览器缓存种存在,就不去继续请求
* f5告诉浏览器,别偷懒,去服务器看看这个文件是否过期,浏览器的请求就会带上If-Modify-since
* ctrl+f5 告诉浏览器先把缓存种的文件删除了,再去服务器请求文件资源
XMLHttpRequest允许在客户端发送网络请求,在XMLHttpRequest还没有出来以前,以前的网页大部分是静态,或者数据的依赖刷新页面获取, 现在通过这个实现异步无刷新获取!
包括以前jquery.ajax, 到现在的模块化axois都实现了对XMLHttpRequest的分装,之后我们两个库着重深入去了解http网络请求
跨域
想要了解跨域就要知道什么时候“同源策略”,浏览器从一个域名的网页去请求另外一个域名的资源时,域名、端口、协议任意一个就是跨域 同源策略: 是浏览器的一个安全限制,从一个源的文档或者脚本默认不能访问另外一个源的资源
网络安全
* CSRF
* XSS
HTTP相关面试考点
https://www.cnblogs.com/chenwenhao/p/11267238.html