html如何获取请求头变量的值。_手写一个静态资源中间件,加深了解服务器对文件请求的缓存策略...
上一篇文章《详解页面静态资源的缓存策略,搞懂强缓存和协商缓存再做性能优化》我们从理论上介绍了浏览器和服务器是如何对静态资源做缓存的,这篇文章我们把它做成一个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如何获取请求头变量的值。_手写一个静态资源中间件,加深了解服务器对文件请求的缓存策略...相关推荐
- glide默认的缓存图片路径地址_手写一个静态资源中间件,加深了解服务器对文件请求的缓存策略...
上一篇文章<详解页面静态资源的缓存策略,搞懂强缓存和协商缓存再做性能优化>我们从理论上介绍了浏览器和服务器是如何对静态资源做缓存的,这篇文章我们把它做成一个node服务器的静态资源中间件. ...
- html如何获取请求头变量的值。_如何使用 Python 爬取微信公众号文章
我比较喜欢看公众号,有时遇到一个感兴趣的公众号时,都会感觉相逢恨晚,想一口气看完所有历史文章.但是微信的阅读体验挺不好的,看历史文章得一页页的往后翻,下一次再看时还得重复操作,很是麻烦. 于是便想着能 ...
- linux获取java环境变量的值,linux获取java环境变量的值
linux获取java环境变量的值 [2021-02-11 00:17:01] 简介: 服务器 这篇文章主要为大家展示了linux环境下怎么配置环境变量,内容简而易懂,希望大家可以学习一下,学习完之 ...
- 服务器策略文件,如何解决服务器对文件请求的缓存策略教程
我们从理论上介绍了浏览器和服务器是如何对静态资源做缓存的,这篇文章我们把它做成一个node服务器的静态资源中间件. 代码开发 既然是开发中间件,肯定是服务端要做的事情,大致流程如下: 图1 服务器接收 ...
- 5 拦截器拦截请求路由_手写简易版axios拦截器,实现微信小程序wx.request的封装与拦截...
前言: axios是一个功能强大的网络请求库,其中拦截器又是axios的精髓.在小程序的开发或者需要手动实现ajax的时候,没有实现对请求的拦截,开发的时候非常不方便,因此手写一个简易版的axios拦 ...
- 手写一个获取验证码的接口,超级简单
手写一个获取验证码的接口,超级简单,觉得有用就试试吧,话不多说代码附上 private static final int VERIFY_CODE_HEIGHT = 25; //验证码高度private ...
- 请求头没有origin参数_在尝试从REST API获取数据时,请求的资源上没有“Access-Control-Allow-Origin”标头...
在尝试从REST API获取数据时,请求的资源上没有"Access-Control-Allow-Origin"标头 我试图从HP Alm的REST API中获取一些数据. 它用一个 ...
- java 反射 静态成员_java 利用反射获取内部类静态成员变量的值
待解析类结构如下: /** * @Author changle * @Time 17/6/13. * @Desc to do */ public class Goods { static class ...
- angularjs 获取复选框的值_基于uFUN开发板的心率计(一)DMA方式获取传感器数据
前言 从3月8号收到板子,到今天算起来,uFUN到手也有两周的时间了,最近利用下班后的时间,做了个心率计,从单片机程序到上位机开发,到现在为止完成的差不多了,实现很简单,uFUN开发板外加一个Puls ...
最新文章
- php base64解码图片 base64加密图片还原
- 详解AI Lab 21篇CVPR 2018论文(附论文)
- 计算机组成原理二进制地址码,计算机组成原理
- asp 与 database (3)
- php _set魔术方法的用法,PHP魔术方法__GET、__SET使用实例
- selinux禁用后系统无法正常启动的问题
- 索尼服务器维护时间,索尼云服务器
- stl取出字符串中的字符_从C ++ STL中的字符串访问字符元素
- oracle立即关闭数据库,Oracle数据库的起步和关闭
- Intel 64/x86_64/x86/IA-32处理器标志寄存器详解(3) - 32位EFLAGS - 概述
- android 动态添加listview,动态向listView Android添加元素
- 2008服务器文件共享,2008服务器文件共享
- mpu6050惯性导航学习记录
- 基于无线传输的多点温度采集系统
- 2019春季高考计算机试题,山东省2019春季高考模拟考试信息技术试试卷+答案(10页)-原创力文档...
- 数据科学猫:数据分析的主要类型、描述性分析、预测性分析与规范性分析
- 专业的户外直播视频传输系统是如何搭建起来的?通过GB28181协议建立的户外直播方案
- 基于MatLab实现LSB(最低有效位)算法完成图片数字水印隐写功能
- 多维偏序总结(CDQ)
- 去除CSDN博客图片中的水印
热门文章
- android9怎样适配nfc,android – 如何使用NFC动作
- Mac OS 软件包管理器Homebrew
- zabbix 安装_Zabbix的WEB安装与配置
- 智能仪表参数设定c语言,智能仪表控制系统:.doc
- win32api.sendmessage模拟鼠标点击_安卓模拟器一键宏设置教程
- python 动态类型检测 性能_4种速度最慢的动态编程语言,你一定用过
- java结构体构建学生 学号_易错题: 程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。...
- python 词表里的词不符合_用骰子DIY真随机助记词 | 火星号精选
- MT7628/MT7688 修改串口2作为调试串口 所踩的坑
- linux实验串行端口程序设计,Linux下串口编程心得(转)