我们从理论上介绍了浏览器和服务器是如何对静态资源做缓存的,这篇文章我们把它做成一个node服务器的静态资源中间件。

代码开发

既然是开发中间件,肯定是服务端要做的事情,大致流程如下:

图1

服务器接收到请求,先解析地址path(一般都是通过path对应到工程下的具体文件);

检查缓存头标志,如果内容没过期,仅修改头信息,304状态返回,如果内容过期了,就要正常返回内容。

图2

我们在static.js文件中开发,这个中间件允许设置目录和其他参数,如图2所示。

图3

如果不是GET或者HEAD请求,可以直接跳过这个中间件,也可以直接返回点什么!

图4

如何获取服务器静态文件的路径?如果设置了根目录,就把请求地址的pathname拼在根目录后面,如果没有设置根目录,就把pathname直接当做文件路径。

图5

当我们拿到文件路径后,需要判断这个路径是否真实存在?如果存在,它就有可能是文件夹,也有可能是文件,我们先处理是文件的情况。

图6

此处我们直接使用mime这个包来设置content-type。

除了图5中处理文件夹的逻辑,还有当请求的路径最后一个字符是“/”时,也需要被当做文件夹处理。如果是文件夹,就需要设置文件夹下的默认文件,一般是index.html。

图7

如图7所示,有两处需要处理文件夹,我们抽取一下逻辑。

图8

options.index可以配置文件夹下默认的文件,类型是数组。如果找到一个存在的文件,就返回这个文件。那么图6中处理单个文件的逻辑和此处一致,可以抽取出来——hanleFile。

代码写到这里,我们的服务已经可以正常返回静态文件的内容了,但是我们还没有设置缓存响应头,下面我们继续开发。

图9

如图9所示,我们设置了Cache-Control、Last-Modify和Etag响应头(etag的获取我们直接利用etag模块计算)。

当一个请求非第一次到达服务器,它有可能带着缓存信息,所以我们要判断文件缓存是否过期,如果没有过期,就返回304状态。

图10

如图10,我们对比一下【Last-Modified,If-Modified-Since】和【ETag、If-None-Match】这两对请求响应头,这是文件内容是否变化的主要依据。

图11

如图11,只要符合服务器的缓存策略(etag==if-none-match或者last-modified<=If-modified-since),就可以返回304状态。

实例

图12

如图12所示,我们写个demo测试一下,效果如下:

从上面的效果看,我们可以发现,第一次请求是200,第二次请求会变成304,说明缓存策略生效了,符合预期!

总结

这篇文章主要是把之前的理论变成能实际应用的代码,虽然还有很多地方需要打磨,但是主体逻辑已经成型,从中可以学习一下思路。

服务器策略文件,如何解决服务器对文件请求的缓存策略教程相关推荐

  1. glide默认的缓存图片路径地址_手写一个静态资源中间件,加深了解服务器对文件请求的缓存策略...

    上一篇文章<详解页面静态资源的缓存策略,搞懂强缓存和协商缓存再做性能优化>我们从理论上介绍了浏览器和服务器是如何对静态资源做缓存的,这篇文章我们把它做成一个node服务器的静态资源中间件. ...

  2. html如何获取请求头变量的值。_手写一个静态资源中间件,加深了解服务器对文件请求的缓存策略...

    上一篇文章<详解页面静态资源的缓存策略,搞懂强缓存和协商缓存再做性能优化>我们从理论上介绍了浏览器和服务器是如何对静态资源做缓存的,这篇文章我们把它做成一个node服务器的静态资源中间件. ...

  3. 云梦四时歌服务器维护,《云梦四时歌》服务器已满怎么解决 服务器排不了队伍解决方法...

    导 读 云梦四时歌服务器已满是游戏刚开服,玩家们会遇到进不去游戏服务器的问题喔,那么云梦四时歌服务器已满怎么办.服务器排不了队伍解决方法呢,九游手游网为大家带来介绍吧. *云梦四时歌服务器已满怎么办? ...

  4. python怎么读取中文文件-Python3 解决读取中文文件txt编码的问题

    问题描述 尝试用Python写一个Wordcloud的时候,出现了编码问题. 照着网上某些博客的说法添添改改后,结果是变成了"UnicodeDecodeError: "utf-8' ...

  5. wow显示登录不上世界服务器,《魔兽世界怀旧服》世界服务器无法连接怎么解决 服务器无法连接解决方法一览...

    导 读 魔兽世界怀旧服世界服务器无法连接怎么回事?有不少玩家都有这样的疑问,今天九游小编就为大家带来一篇魔兽世界怀旧服世界服务器无法连接解决攻略,希望可以帮到各位玩家 魔兽世界怀旧服世界服务器... ...

  6. 网站提示服务器磁盘空间不足,解决服务器磁盘空间不足

    今天下午,服务器提示磁盘剩余空间不足,使用 df 命令查看,发现/目录下的磁盘已经没有多余空间,然后使用 fdisk -l 查看所有磁盘,发现 sdb.sdc 两块 2T 的硬盘未 被使用,于是开始为 ...

  7. Java后端与Vue前端导出Excel表格文件并解决乱码和文件打不开

    Java 需要用到 poi 两个依赖包,Maven如下: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> &l ...

  8. AJAX技术文案沙雕,vue-router 中使用 keep-alive 控制 ajax 请求的缓存策略(二)

    前文的解决方法 其实是有问题的. 1. 问题 前文提到 saved_position 的返回值有时是 undefined,有时是 null.经过仔细调试,可以发现 undefined 只会出现一次,以 ...

  9. c代码突然全变成了乱码可以恢复妈_u盘里出现了好多乱码文件怎么恢复_u盘文件全变成了乱码解决方法...

    2020-02-06 14:37:12 我们在使用电脑办公时经常会用到u盘在里面进行存储文件,但使用久了之后难免会出现一些问题,有用户就表示自己在打开u盘文件时出现了乱码的情况不知道怎么办.没关系本文 ...

最新文章

  1. UA MATH524 复变函数6 Green定理与Green公式
  2. JVM:永久代 以及jdk1.8为什么将其移除?
  3. 数据中心基础设施管理的演进
  4. oracle--rowid
  5. Mac电脑「空格键」的使用技巧
  6. Struts2之前台表单传值到后台Action方法总结
  7. python--DenyHttp项目(1)--socket编程:客户端与服务器端
  8. 2017 校赛 问题 B: CZJ-Superman
  9. TC中编辑程序快捷键
  10. spring扩展点四:SmartInitializingSingleton 补充
  11. C语言不使用中间变量交换两个变量值
  12. Spring boot视频播放(解决MP4大文件无法播放),整合ffmpeg,用m3u8切片播放。
  13. 使用Docker提交代码参加天池比赛流程
  14. WinINet 与 WinHTTP简介
  15. 如何入门漏洞挖掘,以及提高自己的挖掘能力
  16. 数据结构题目收录(一)
  17. 201506051031_《JavaScript权威指南》(p104-143)
  18. 用户 不在 sudoers 文件中。此事将被报告
  19. MVP Architecture on Android
  20. MacOS 10.15 Laravel框架 使用 Box/Spout 导入导出Excel

热门文章

  1. Kingbase金仓更改表空间
  2. py+selenium 报错NameError: name 'NoSuchElementException' is not defined【已解决】
  3. django 的form登录 注册
  4. 144.ipv4地址匮乏的解决方法
  5. 《2020雇佣关系趋势报告》今发布:近三成受访者兼职,近七成工作量增加、考核变严格
  6. 开发人员职位:对编程语言Python的需求明显下降
  7. Windows程序设计:MFC 、Winform 和 WPF 比较
  8. NLP技术路线详解:这是从数学到算法的艺术
  9. 清华计算机知识工程怎么样,张民(muslv)清华大学计算机系知识工程组 硕士清华大学.ppt...
  10. ConcurrentHashMap介绍