http缓存相关头
https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ
这里说的一下我对http控制客户端缓存的头的理解。
在请求一个静态文件的时候(图片,css,js)等,这些文件的特点是文件不经常变化,将这些不经常变化的文件存储起来,对客户端来说是一个优化用户浏览体验的方法。这就是客户端缓存的意义了。
客户端缓存文件存放在临时文件夹中,但是这里有个问题就是这个缓存文件存放多久呢?这个是有服务器端进行设置的。
Expires/Cache-Control
http头中的Expires/Cache-Control就是完成这个事情的。
当客户端第一次访问资源的时候,服务端再返回资源内容的同时也返回了Expires:2016-11-17T10:50:55.120Z.
服务器告诉浏览器:你Y的先把这个文件给我缓存起来,在这个日期之前,这个文件都不会变化了,你下次需要这个文件的时候,你就不要来找我要了,你就去缓存中拿就好了,又快又好。
浏览器:诺。
但是,浏览器毕竟在客户端,客户端的时间可能会不准确,用户可以随着自己的心情修改自己的机器时间,比如我把时间调成了2019-11-17T10:50:55.120Z.,那么怎么办呢?于是服务器怒了:我给你个绝对时间,你乱改,那我就给你个相对时间吧,于是返回了Cache-Control:max-age:600,浏览器你给我缓存十分钟去,于是浏览器就乖乖缓存十分钟去了。
但是问题又来了,如果服务器同时设置了Expires和Cache-Control怎么办呢?(不是闲着没事干,而是由于Cache-Control是http1.1中才有的)那么就是根据更先进的设置Cache-Control为标准。
好了,现在有个问题,我有个文件可能时不时会更新,服务器非常希望客户端时不时过来问一下这个文件是否过期,如果没过期,服务端只会告诉浏览器你的缓存还没有过期(304),服务端不会反悔数据。然后浏览器使用自己存储的缓存来做显示。这个就叫做条件请求。
Last-Modified/If-Modifiy-since
客户端第一次访问资源的时候,服务端反悔资源内容的同事返回了Last-Modifed:Wed, 07 Aug 2016 15:32:18 GMT服务端在告诉客户端你获取的这个文件我最后修改的时间,浏览器获取这个文件存到缓存中时,给缓存中的文件同时记录上这个最后修改时间。
第二次访问的时候(我们假设这里没有设置expires或者cache-control)那么服务端范文资源的时候会带上If-Modify-since:Wed, 07 Aug 2016 15:32:18 GMT ;
客户端询问服务端:喂,我需要的这个资源其实我这边已经有缓存了,我的缓存文件的最后修改时间是不是这个,如果你那边没有修改的话告诉我一下就好,不用返回实际的资源内容。繁殖,要是你有修改的话,你就把文件内容返回给我吧。
服务端回应说:如果没有修改返回304给客户端。如果有变化呢,就返回200,并且带上资源内容。
这个条件请求还有另一种方法:打标签(Tag).
ETag/If-None-Match
第一次访问资源的时候,服务端返回资源内容的同时返回了ETag:1234,告诉客户端:这个文件的标签是1234,我如果修改了我这边的资源的话,这个标签就会不一样了。
第二次客户端访问资源的时候,由于缓存中已经有Etag为1234的资源,客户端要去服务端查询的是这个资源有木有过期呢?所以带上了If-None-Match:1234。告诉服务端:如果你那边资源还是1234标签的资源,你就返回304。如果不是的话,你在返回资源内容好了。服务端比较下ETag来看是返回304还是200.
各种刷新
理解了上面的缓存标签之后就很好理解各种刷新了。
刷新有三种
浏览器中写地址,回车
F5
Ctrl+F5
假设对一个资源:
浏览器第一次访问,获取资源内容和cache-control: max-age:600,Last_Modify: Wed, 10 Aug 2013 15:32:18 GMT
于是浏览器把资源文件放到缓存中,并且决定下次使用的时候直接去缓存中取了。
浏览器url回车
浏览器发现缓存中有这个文件了,好了,就不发送任何请求了,直接去缓存中获取展现。(最快)
下面我按下了F5刷新
F5就是告诉浏览器,别偷懒,好歹去服务器看看这个文件是否有过期了。于是浏览器就胆胆襟襟的发送一个请求带上If-Modify-since:Wed, 10 Aug 2013 15:32:18 GMT
然后服务器发现:诶,这个文件我在这个时间后还没修改过,不需要给你任何信息了,返回304就行了。于是浏览器获取到304后就去缓存中欢欢喜喜获取资源了。
但是呢,下面我们按下了Ctrl+F5
这个可是要命了,告诉浏览器,你先把你缓存中的这个文件给我删了,然后再去服务器请求个完整的资源文件下来。于是客户端就完成了强行更新的操作...
还有说一下,那个ETag实际上很少人使用,因为它的计算是使用算法来得出的,而算法会占用服务端计算的资源,所有服务端的资源都是宝贵的,所以就很少使用etag了。
http缓存相关头的更多相关文章
- 大话PHP缓存头
304的请求机制和200有什么不一样呢?在fiddler中查看304请求的时候突然想到这个问题,就想到研究下这个304请求机制了. 我们自己在nginx上放一个文件,test.png.可以使用下面的地 ...
- JavaEE:response响应和request请求
Web服务器接收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象既然代表请求和响应,那么我 ...
- NSURLSession 所有的都在这里(二)
前面一篇我们说了什么? 这是这个关于NSURLSession的第二篇文章,第一篇再加上这篇文章,就大概的把NSURLSession的API以及一些简单使用我们也就说的差不多了,这篇文章总结哪些点呢?相 ...
- 前端性能优化 —— 添加Expires头与Cache-control区别
要:添加Expires头能有效的利用浏览器的缓存能力来改善页面的性能,能在后续的页面中有效避免很多不必要的Http请求,WEB服务器使用Expires头来告诉Web客户端它可以使用一个组件的当前副本, ...
- response响应
郭晨 软件151 1531610114 response1.response常用APIsetStatus:设置响应行当中的状态码setHeader:设置响应头信息getOutputStream:获得字 ...
- http协议相关
HTTP请求方法 HTTP消息头 HTTP请求头 HTTP响应头 HTTP cookie机制和实现原理 HTTP请求方法 超文本传输协议(HTTP, HyperText Transfer Protoc ...
- java攻城师之路--复习java web之request_respone
Servlet技术 两条主线1.HTTP协议 2.Servlet生命周期 init() 方法中参数 ServletConfig 对象使用通过ServletConfig 获得 ServletContex ...
- HTTP消息头(HTTP headers)-HTTP请求头与HTTP响应头
感谢大佬:https://itbilu.com/other/relate/E1T0q4EIe.html HTTP协议将传输的信息分隔为两部分:HTTP信息头.HTTP信息体.通过HTTP头信息,使客户 ...
- Databricks缓存提升Spark性能--为什么NVMe固态硬盘能够提升10倍缓存性能(原创)
我们兴奋的宣布Databricks缓存的通用可用性,作为统一分析平台一部分的 Databricks 运行时特性,它可以将Spark工作负载的扫描速度提升10倍,并且这种改变无需任何代码修改. 1.在本 ...
随机推荐
- JSON总结(java篇)
JSON总结(java篇一) JSON简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于 ...
- [转载] php用csv文件导出大量数据
header ( "Content-type:application/vnd.ms-excel" ); header ( "Content-Disposition:fil ...
- Lind.DDD.Domain.ISortBehavor~上移与下移
在进行列表排序时,有个“上移”和“下移”操作,这个一般在内存里完成,然后统一提交到数据库中,对于上移与下移的设计,大叔在LIND.DDD.DOMAIN里有一个ISortBehavor接口,主要是说,如 ...
- java必备基础知识点
Java基础 1. 简述Java的基本历史 java起源于SUN公司的一个GREEN的项目,其原先目的是:为家用消费电子产品发送一个信息的分布式代码系统,通过发送信息控制电视机.冰箱等 2. 简单写出 ...
- PowerDesigner16 基本使用教程
一.基本概念 概念数据模型也称信息模型,它以实体-联系(Entity-RelationShip,简称E-R)理论为基础,并对这一理论进行了扩充. 它从用户的观点出发对信息进行建模,主要用于数据库的概念 ...
- js 模块化的一些理解和es6模块化学习
模块化 1 IIFE 2 commonjs 3 浏览器中js的模块化 4 简单理解模块加载器的原理 5 es6 之前在参加百度前端技术学院做的小题目的时候,自己写模块的时候 都是写成立即调用表达式( ...
- Semaphore(计数信号量)
//对象池public class Pool<T> { private int size; private List<T> items = new ArrayList<T ...
- Apache日志按天切割
Linux系统配置方法: 将其改为 ErrorLog "| /usr/local/apache/bin/rotatelogs /home/logs/www/error_%Y%m%d.log ...
- Oracle报错,ORA-28001: 口令已经失效[转]
Oracle11G创建用户时缺省密码过期限制是180天(即6个月), 如果超过180天用户密码未做修改则该用户无法登录. Oracle公司是为了数据库的安全性默认在11G中引入了这个默认功能,但是这个 ...
- Listview详解
Listview应该是最为常见的控件.对于大多数规则排列的界面,几乎都可以用ListView进行编写.对于单一界面来说,ListView既是最难的控件,又是使用最为频繁的控件.ListView 通常用 ...