缓存的作用
- 减少了冗余的数据传输,节省了网费
- 减少了服务器的负担,大大提高了网站的性能
第一次请求
浏览器请求——>无缓存——>向web服务器请求——请求响应,缓存协商——>呈现
第二次请求
浏览器请求——>有缓存——>是否过期?
通过最后修改时间来 判断缓存是否可用
- Last-Modified:响应时 告诉客户端此资源的最后修改时间
- If-Modified-Since:当资源过期时(使用Cache-Control标识的max-age),发现具有Last-Modified声明,则再次向服务器请求时带上头If-Modified-Since
- 服务器收到请求后发现有头If-Modified-Since则与被请求资源的 最后修改时间进行比对。若最后修改时间较新,说明资源又被改动过,则响应最新的资源内容并返回200状态码
- 若最后修改时间和If-Modified-Since一样说明资源没有修改,则响应304表示未更新,告之浏览器继续使用所保存的缓存文件
最后修改时间存在问题
- 某些服务器不能精确得到文件的最后修改时间,这样就无法通过最后修改时间来判断文件是否跟新了
- 某些文件的修改 非常频繁,在秒以下的时间进行修改。Last-Modified只能精确到秒
- 一些文件的最后修改时间变 了,但是内容并没有改变。我们不希望客户端认为这个文件修改了
- 如果同样一个文件位于多个CDN服务器上的时候内容虽然一样,修改时间不一样
var fs=require('fs');
var express=require('express');
var http=require('http');
function send(filename,req,res){
//取得最后修改时间
var lastModified=new Date(req.headers['if-modified-since']);
fs.stat(filename,function(err,stat){
if(stat.mtime.getTime()==lastModified.getTime()){
res.statusCode=304;
res.end();
}else{
res.writeHead(200,{'Last-Modified':stat.mtime.toGMTString()});
fs.createReadStream(filename).pipe(res);
}
})
}
http.createServer(function(req,res){
if(req.url != '/favicon.ico'){
console.log(req.url);
var filename=req.url.slice(1);
send(filename,req,res);
}else{
res.end('404');
}
}).listen(8080);
ETag
ETag是实体标签的缩写,根据实体内容生成一段字符串,可以标识资源的状态。当资源发送改变时,ETag 也随之改变。ETag 是web服务端产生的,然后发给浏览器客户端
- 客户端想判断缓存是否可用可以先获得缓存中文档的ETag ,然后通过If-None-Match发送请求给web服务器询问此缓存是否有用
- 服务器收到请求,将服务器中的此文件的ETag,跟请求头中的If-None-Mach相比较,如果值是一样的,说明缓存还是最新的,web服务器将发送304Not Modified响应码给客户端表示缓存未修改过,可以使用
- 如果不一样则Web服务器将发送该文档的最新版本给浏览器客户端
MD5
用于确保信息传输完整一致,是计算机广泛使用的杂凑算法之一(摘要算法,哈希算法)主要编程语言都已经实现MD5,将数据如汉字运算为另一固定长度值,是杂凑算法的基础原理。前身是MD2,MD3和MD4
特点
- 压缩性:任意长度的数据,算出的MD5值长度都是固定的
- 容易计算:从原数据计算出MD5值很容易
- 抗修改性:对元数据进行任何改动,哪怕只修改一个字节,所得到的MD5的值都有很大差别
- 抗碰撞性:已知原数据和其MD5的值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被压缩成一种保密的格式(就是吧一个任意长度的字节串变换成一个定长的十六进制数字串。除了MD5,其中比较有名的还有sha-1,RIPEMD等)
var crypto=require('crypto');
function getHash(str){
//创建一个hash实例
var shaum=crypto.createHash('sha1');
return shaum.update(str).digest('base64');
}
console.log(getHash("zz"))