上一篇文章《详解页面静态资源的缓存策略,搞懂强缓存和协商缓存再做性能优化》我们从理论上介绍了浏览器和服务器是如何对静态资源做缓存的,这篇文章我们把它做成一个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测试一下,效果如下:

图13

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

总结

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

喜欢我的文章就关注我吧,有问题可以发表评论,我们一起学习,共同成长!

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

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

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

  2. html如何获取请求头变量的值。_如何使用 Python 爬取微信公众号文章

    我比较喜欢看公众号,有时遇到一个感兴趣的公众号时,都会感觉相逢恨晚,想一口气看完所有历史文章.但是微信的阅读体验挺不好的,看历史文章得一页页的往后翻,下一次再看时还得重复操作,很是麻烦. 于是便想着能 ...

  3. linux获取java环境变量的值,linux获取java环境变量的值

    linux获取java环境变量的值 [2021-02-11 00:17:01]  简介: 服务器 这篇文章主要为大家展示了linux环境下怎么配置环境变量,内容简而易懂,希望大家可以学习一下,学习完之 ...

  4. 服务器策略文件,如何解决服务器对文件请求的缓存策略教程

    我们从理论上介绍了浏览器和服务器是如何对静态资源做缓存的,这篇文章我们把它做成一个node服务器的静态资源中间件. 代码开发 既然是开发中间件,肯定是服务端要做的事情,大致流程如下: 图1 服务器接收 ...

  5. 5 拦截器拦截请求路由_手写简易版axios拦截器,实现微信小程序wx.request的封装与拦截...

    前言: axios是一个功能强大的网络请求库,其中拦截器又是axios的精髓.在小程序的开发或者需要手动实现ajax的时候,没有实现对请求的拦截,开发的时候非常不方便,因此手写一个简易版的axios拦 ...

  6. 手写一个获取验证码的接口,超级简单

    手写一个获取验证码的接口,超级简单,觉得有用就试试吧,话不多说代码附上 private static final int VERIFY_CODE_HEIGHT = 25; //验证码高度private ...

  7. 请求头没有origin参数_在尝试从REST API获取数据时,请求的资源上没有“Access-Control-Allow-Origin”标头...

    在尝试从REST API获取数据时,请求的资源上没有"Access-Control-Allow-Origin"标头 我试图从HP Alm的REST API中获取一些数据. 它用一个 ...

  8. java 反射 静态成员_java 利用反射获取内部类静态成员变量的值

    待解析类结构如下: /** * @Author changle * @Time 17/6/13. * @Desc to do */ public class Goods { static class ...

  9. angularjs 获取复选框的值_基于uFUN开发板的心率计(一)DMA方式获取传感器数据

    前言 从3月8号收到板子,到今天算起来,uFUN到手也有两周的时间了,最近利用下班后的时间,做了个心率计,从单片机程序到上位机开发,到现在为止完成的差不多了,实现很简单,uFUN开发板外加一个Puls ...

最新文章

  1. php base64解码图片 base64加密图片还原
  2. 详解AI Lab 21篇CVPR 2018论文(附论文)
  3. 计算机组成原理二进制地址码,计算机组成原理
  4. asp 与 database (3)
  5. php _set魔术方法的用法,PHP魔术方法__GET、__SET使用实例
  6. selinux禁用后系统无法正常启动的问题
  7. 索尼服务器维护时间,索尼云服务器
  8. stl取出字符串中的字符_从C ++ STL中的字符串访问字符元素
  9. oracle立即关闭数据库,Oracle数据库的起步和关闭
  10. Intel 64/x86_64/x86/IA-32处理器标志寄存器详解(3) - 32位EFLAGS - 概述
  11. android 动态添加listview,动态向listView Android添加元素
  12. 2008服务器文件共享,2008服务器文件共享
  13. mpu6050惯性导航学习记录
  14. 基于无线传输的多点温度采集系统
  15. 2019春季高考计算机试题,山东省2019春季高考模拟考试信息技术试试卷+答案(10页)-原创力文档...
  16. 数据科学猫:数据分析的主要类型、描述性分析、预测性分析与规范性分析
  17. 专业的户外直播视频传输系统是如何搭建起来的?通过GB28181协议建立的户外直播方案
  18. 基于MatLab实现LSB(最低有效位)算法完成图片数字水印隐写功能
  19. 多维偏序总结(CDQ)
  20. 去除CSDN博客图片中的水印

热门文章

  1. android9怎样适配nfc,android – 如何使用NFC动作
  2. Mac OS 软件包管理器Homebrew
  3. zabbix 安装_Zabbix的WEB安装与配置
  4. 智能仪表参数设定c语言,智能仪表控制系统:.doc
  5. win32api.sendmessage模拟鼠标点击_安卓模拟器一键宏设置教程
  6. python 动态类型检测 性能_4种速度最慢的动态编程语言,你一定用过
  7. java结构体构建学生 学号_易错题: 程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。...
  8. python 词表里的词不符合_用骰子DIY真随机助记词 | 火星号精选
  9. MT7628/MT7688 修改串口2作为调试串口 所踩的坑
  10. linux实验串行端口程序设计,Linux下串口编程心得(转)