浏览器缓存问题原理以及解决方案

浏览器缓存问题:

简单来说,浏览器缓存就是把一个已经请求过的Web资源(如html页面,图片,js,数据等)拷贝一份副本储存在浏览器中。缓存会根据进来的请求保存输出内容的副本。当下一个请求来到的时候,如果是相同的URL,缓存会根据缓存机制决定是直接使用副本响应访问请求,还是向源服务器再次发送请求。比较常见的就是浏览器会缓存访问过网站的网页,当再次访问这个URL地址的时候,如果网页没有更新,就不会再次下载网页,而是直接使用本地缓存的网页。只有当网站明确标识资源已经更新,浏览器才会再次下载网页。

为什么使用缓存:

(1)减少网络带宽消耗

(2)降低服务器压力

(3)减少网络延迟,加快页面打开速度

浏览器端的缓存规则:

新鲜度(过期机制):也就是缓存副本有效期。

校验值(验证机制):资源的实体标签Etag(EntityTag)

 

举个栗子

 

 

解决方法:

(1)使用HTMLMeta标签

  Web开发者可以在HTML页面的<head>节点中加入<meta>标签,代码如下

             <metahttp-equiv="Pragma"content="no-cache">

  事实上这种禁用缓存的形式用处很有限:

          a.仅有IE才能识别这段meta标签含义,其它主流浏览器仅识别“Cache-Control:no-store”的meta标签。

          b.在IE中识别到该meta标签含义,并不一定会在请求字段加上Pragma,但的确会让当前页面每次都发新请求(仅限页面,页面上的资源则不受影响)

(2)使用缓存有关的HTTP消息报头

          在HTTP请求和响应的消息报头中,常见的与缓存有关的消息报头有:

规则

消息包头

值/示例

类型

作用

新鲜度

Pragma

no-cache

响应

告诉浏览器忽略资源的缓存副本,每次访问都需要去服务器拉取【http1.0中存在的字段,在http1.1已被抛弃,使用Cache-Control替代,但为了做http协议的向下兼容,很多网站依旧会带上这个字段】

Expires

Mon,15Aug201603:56:47GMT

响应

启用缓存和定义缓存时间。告诉浏览器资源缓存过期时间,如果还没过该时间点则不发请求【http1.0中存在的字段,该字段所定义的缓存时间是相对服务器上的时间而言的,如果客户端上的时间跟服务器上的时间不一致(特别是用户修改了自己电脑的系统时间),那缓存时间可能就没啥意义了。在HTTP1.1版开始,使用Cache-Control:max-age=秒替代】

Cache-Control

no-cache

响应

告诉浏览器忽略资源的缓存副本,强制每次请求直接发送给服务器,拉取资源,但不是“不缓存”

no-store

响应

强制缓存在任何情况下都不要保留任何副本

max-age=[秒]

响应

指明缓存副本的有效时长,从请求时间开始到过期时间之间的秒数

public

响应

任何路径的缓存者(本地缓存、代理服务器),可以无条件的缓存改资源

private

响应

只针对单个用户或者实体(不同用户、窗口)缓存资源

Last-Modified

Mon,15Aug201603:56:47GMT

响应

告诉浏览器这个资源最后的修改时间。服务器将资源传递给客户端时,会将资源最后更改的时间以“Last-Modified:GMT”的形式加在实体首部上一起返回给客户端【只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间】

If-Modified-Since

Mon,15Aug201603:56:47GMT

请求

其值为上次响应头的Last-Modified值,再次向web服务器请求时带上头If-Modified-Since。web服务器收到请求后发现有头If-Modified-Since则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容(写在响应消息包体内),包括更新Last-Modified的值,HTTP200;若最后修改时间较旧,说明资源无新修改,则响应HTTP304(无需包体,节省浏览),告知浏览器继续使用所保存的cache

校验值

ETag

"fd56273325a2114818df4f29a628226d"

响应

告诉浏览器当前资源在服务器的唯一标识符(生成规则又服务器决定)

If-None-Match

"fd56273325a2114818df4f29a628226d"

请求

当资源过期时(使用Cache-Control标识的max-age),发现资源具有Etage声明,则再次向web服务器请求时带上头If-None-Match(Etag的值)。web服务器收到请求后发现有头If-None-Match则与被请求资源的相应校验串进行比对,决定返回200或304

 实际工作中我们完全可以时用上面这些参数的设置来组织/控制、更好的利用缓存来为我们服务。

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

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

相关文章

Scikit-Learn机器学习入门

现在最常用的数据分析的编程语言为R和Python。每种语言都有自己的特点&#xff0c;Python因为Scikit-Learn库赢得了优势。Scikit-Learn有完整的文档&#xff0c;并实现很多机器学习算法&#xff0c;而每种算法使用的接口几乎相同&#xff0c;可以非常快的测试其它学习算法。 Pa…

hdu1542 Atlantis(扫描线+线段树+离散)矩形相交面积

题目链接&#xff1a;点击打开链接 题目描写叙述&#xff1a;给定一些矩形&#xff0c;求这些矩形的总面积。假设有重叠。仅仅算一次 解题思路&#xff1a;扫描线线段树离散&#xff08;代码从上往下扫描&#xff09; 代码&#xff1a; #include<cstdio> #include <al…

浏览器滚动条 --- 自定义“衣裳”

由于种种原因&#xff0c;浏览器的默认滚动条“衣裳”实在是 (ˉ▽&#xffe3;&#xff5e;)~~&#xff0c;为了“美”&#xff0c;本人结合万维网各大神给的经验和自己的实践&#xff0c;做了此篇总结。若有错误&#xff0c;请在评论里给出&#xff0c;我会及时更改。 我在电…

电脑调分辨率黑屏了怎么办_调显示器分辨率黑屏怎么办

调显示器分辨率黑屏怎么办调显示器分辨率黑屏解决方法&#xff1a;1&#xff0c;开机&#xff0c;当快要进入系统选项时&#xff0c;立即按f8键进入“高级模式”&#xff0c;因为系统选项界面显示的时间非常短&#xff0c;可以提早按f8键&#xff0c;否则错过时机就得重来。2&a…

什么是JNDI,SPI,CCI,LDAP和JCA?

JNDI代表Java命名和目录接口 。 它是用于提供对目录服务&#xff08;即带有对象的服务映射名称&#xff08;字符串&#xff09;&#xff0c;对远程对象或简单数据的引用&#xff09;的访问的API。 这就是所谓的 约束力 。 绑定集称为上下文 。 应用程序使用JNDI接口访问资源。…

android studio gradle 学习,学习Android Studio里的Gradle

一直听说Gradle很强大&#xff0c;只是偶尔用Android Studio创建Demo的时候看到他一次&#xff0c;今天抽个时间完整记录一下。1.gradle位置Android Studio项目创建好之后&#xff0c;默认有3个gradle文件&#xff0c;分别位于&#xff1a;/settings.gradle/build.gradle/app/b…

接口耗时打印并统计

1.可以利用Tomcat的access-log日志&#xff0c;让其打印出http请求的每次耗时。可以在 config/server.xml里Host标签下配置tomcat访问日志格式 <Valve className"org.apache.catalina.valves.AccessLogValve" directory"logs" prefix&quo…

js内存

js在定义变量时完成了内存的分配 js具有自动垃圾回收机制&#xff0c;垃圾回收器会每隔固定的一段时间就执行一次释放操作&#xff0c;即找出那些不再继续使用的值&#xff0c;释放其占用的内存 js中最常用的是通过标记清除的算法来找到哪些对象是不再继续使用的&#xff0c;因…

halcon 图像差分_Halcon编程-基于纹理的mara检测

表面瑕疵检测是机器视觉领域非常重要的一个应用。机器视觉是集光学、机电和计算机三个领域的一门不算新的技术。但目前表面瑕疵检测在学界主要是计算机专业或者控制专业瞄准图像处理方向在做&#xff0c;而视觉光学系统这一块主要是光学工程专业在做。很少有研究者把这三块都结…

Apache Camel入门

在先前的博文中&#xff0c;我们了解了企业集成模式&#xff08;EIP&#xff09;。 现在&#xff0c;在这篇文章中&#xff0c;我们将研究实现这些模式的Apache Camel框架。 关于骆驼&#xff1a; Apache Camel是一个开放源代码项目&#xff0c;已有将近5年的历史&#xff0c;…

css 写打印样式问题

&#xff08;1&#xff09;背景颜色打印不出来问题解决方法 background样式要加上 !important&#xff1b;color样式要加上 !important&#xff1b;-webkit-print-color-adjust: exact;然后记得浏览器打印设置里面要在“打印背景图形”前面打勾。 -webkit-print-color-adjust:…

android studio smssdk,SMSSDK for Android 配置

1.集成之前先要申请Mob的appkey与appsecret2.在Mob官网下载最新SDK&#xff0c;解压后会看到以下目录结构&#xff1a;SMSSDK下存放的是短信SDK的全部内容。3.在android studio中加入SMS的第三方库AS版本的SMSSDK目录下包含以下内容&#xff1a;MobCommons.jar&#xff1a;Mob …

linux后台不挂断运行 nohup命令

//后台常在 退出终端仍然运行 nohup python pyredis.py & nohup输出重定向到my.log nohup command > my.log 2>&1 &转载于:https://www.cnblogs.com/plxm/p/8136833.html

Ubuntu 16.04安装微信

微信没有出Linux的版本&#xff0c;但是可以通过以下方式解决&#xff1a; 1、使用网页版&#xff0c;除了没有公众号之后&#xff0c;一切都没问题&#xff0c;包括传文件等。 网页登录地址&#xff1a;https://wx.qq.com/ 2、使用第三方版本&#xff0c;只不过这个是桌面应用…

navision系统和sap区别_SAP那些事-实战篇-89-浅谈金税接口方案

以前金税接口这块一直是销售顾问在做&#xff0c;虽然和财务相关&#xff0c;也没有怎么关注。这次项目把金税接口分到了财务模块&#xff0c;结果遇到了一些问题&#xff0c;趁此机会把这块总结一下方案&#xff0c;供各位看官参考。方案1&#xff1a; 文本方案&#xff0c;这…

不变性的来龙去脉

因此&#xff0c;在我的第一篇文章中&#xff0c;我谈到了一些构建器模式&#xff0c;并提到了一个非常强大但却被忽视的概念&#xff1a;不变性。 什么是不可变类&#xff1f; 这只是一个其实例无法修改的类。 类属性的每个值都在其声明或其构造函数中设置&#xff0c;并在对…

JavaScript总结(3)

第3章 获取用户的输入 &#xff1c;script&#xff1e;10 intAprompt("请输入第一个数字","");11 intBprompt("请输入第二个数字",27);默认是2712 document.write("你输入的第一个数字是"intA);13 document.write("&#xff1c;…

css书写规范

在书写css样式的时候总是无意中就写乱了&#xff0c;无论是命名或者是样式的书写顺序&#xff0c;这里做一个总结&#xff0c;提醒自己在书写css的时候时刻注意&#xff0c;大家可以参考哈。 1. 样式属性顺序 单个样式规则下的属性在书写时&#xff0c;应按功能进行分组&…

android 协程,关于android:Kotlin协程实现原理SuspendCoroutineContext

明天咱们来聊聊Kotlin的协程Coroutine。如果你还没有接触过协程&#xff0c;举荐你先浏览这篇入门级文章What? 你还不晓得Kotlin Coroutine?如果你曾经接触过协程&#xff0c;置信你都有过以下几个疑难&#xff1a;协程到底是个什么货色&#xff1f;协程的suspend有什么作用&…

清空easyui checkbox选中项

$(#dg).datagrid(unselectAll);转载于:https://www.cnblogs.com/douhuan/p/7116744.html