最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

node.js實(shí)現(xiàn)http服務(wù)器與瀏覽器之間的內(nèi)容緩存操作示例

 更新時(shí)間:2020年02月11日 09:52:53   作者:懷素真  
這篇文章主要介紹了node.js實(shí)現(xiàn)http服務(wù)器與瀏覽器之間的內(nèi)容緩存操作,結(jié)合實(shí)例形式分析了node.js http服務(wù)器與瀏覽器之間的內(nèi)容緩存原理與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下

本文實(shí)例講述了node.js實(shí)現(xiàn)http服務(wù)器與瀏覽器之間的內(nèi)容緩存操作。分享給大家供大家參考,具體如下:

一、緩存的作用

1、減少了數(shù)據(jù)傳輸,節(jié)約流量。

2、減少服務(wù)器壓力,提高服務(wù)器性能。

3、加快客戶(hù)端加載頁(yè)面的速度。

二、緩存的分類(lèi)

1、強(qiáng)制緩存,如果緩存有效,則不需要與服務(wù)器發(fā)生交互,直接使用緩存。

2、對(duì)比緩存,每次都需要與服務(wù)器發(fā)生交互,對(duì)緩存進(jìn)行比較判斷是否可以使用緩存。

三、通過(guò)使用 Last-Modified / If-Modified-Since 來(lái)進(jìn)行緩存判斷

1、Last-Modified 是服務(wù)器向客戶(hù)端發(fā)送的頭信息,用于告訴客戶(hù)端資源的 最后修改時(shí)間,該信息瀏覽器會(huì)保存起來(lái)。

2、If-Modified-Since 是客戶(hù)端向服務(wù)器發(fā)送的頭信息,當(dāng)客戶(hù)端再次請(qǐng)求資源時(shí),瀏覽器會(huì)帶上該信息發(fā)送給服務(wù)器,服務(wù)器通過(guò)該信息來(lái)判斷資源是否過(guò)期。

3、如果沒(méi)有過(guò)期,則響應(yīng) 304 表示 未更新,告訴瀏覽器使用保存的緩存。

4、如果過(guò)期了,則響應(yīng) 200,返回最新的資源。

const http = require('http');
const url = require('url');
const path = require('path');
const fs = require('fs');
const util = require('util');
const mime = require('mime');
//創(chuàng)建http服務(wù)器并監(jiān)聽(tīng)端口
let server = http.createServer();
server.listen(1234, '0.0.0.0', function () {
  console.log('開(kāi)始監(jiān)聽(tīng)');
});
function sendFile(req, res, filePath, stats) {
  //設(shè)置文件內(nèi)容類(lèi)型
  res.setHeader('Content-Type', mime.getType(filePath));
  //設(shè)置資源最后修改時(shí)間頭信息
  res.setHeader('Last-Modified', stats.ctime.toGMTString());
  //通過(guò)管道將文件數(shù)據(jù)發(fā)送給客戶(hù)端
  fs.createReadStream(filePath).pipe(res);
}
server.on('request', function (req, res) {
  let {pathname} = url.parse(req.url, true);
  //獲取文件真實(shí)路徑
  let filePath = path.join(__dirname, pathname);
  //判斷文件是否存在
  fs.stat(filePath, function (err, stats) {
    if (err) {
      return res.end(util.inspect(err));
    }
    if (!stats.isFile()) {
      return res.end('is not file');
    }
    //獲取客戶(hù)端請(qǐng)求的If-Modified-Since頭信息
    let ifModifiedSince = req.headers['if-modified-since'];
    if (ifModifiedSince) {
      //如果最后修改時(shí)間相同,說(shuō)明該資源并未修改,直接響應(yīng) 304,讓瀏覽器從緩存中獲取數(shù)據(jù)。
      if (ifModifiedSince == stats.ctime.toGMTString()) {
        res.statusCode = 304;
        res.end();
      } else {
        sendFile(req, res, filePath, stats);
      }
    } else {
      sendFile(req, res, filePath, stats);
    }
  });
});

通過(guò)最后修改時(shí)間判斷緩存是否可用,并不是很精確,有如下幾個(gè)問(wèn)題:

1、Last-Modified 只精確到秒,秒以下的時(shí)間修改,將無(wú)法準(zhǔn)確判斷。

2、文件最后修改時(shí)間變了,但 內(nèi)容并沒(méi)有發(fā)生改變。

3、文件存在于多個(gè) CDN 上,那該文件的最后修改時(shí)間是不一樣的。

四、通過(guò) ETag / If-None-Match 進(jìn)行判斷

ETag 表示 實(shí)體標(biāo)簽,將內(nèi)容通過(guò) hash 算法生成一段字符串,用以標(biāo)識(shí)資源,如果資源發(fā)生變化,則 ETag 也會(huì)變化。

ETag 是服務(wù)器生成的,發(fā)送給客戶(hù)端的。

1、客戶(hù)端請(qǐng)求資源,服務(wù)器根據(jù)資源生成ETag,發(fā)送給客戶(hù)端。瀏覽器會(huì)保存該信息。

2、當(dāng)客戶(hù)端再次請(qǐng)求時(shí),瀏覽器會(huì)發(fā)送 If-None-Match 給服務(wù)器,值為第1步保存的信息,服務(wù)器通過(guò)該信息進(jìn)行判斷,資源是否修改過(guò)。

3、如果沒(méi)有修改過(guò),則響應(yīng) 304 未更新,告訴瀏覽器使用保存的緩存。

4、如果修改過(guò),則響應(yīng) 200,返回最新資源。

const http = require('http');
const url = require('url');
const path = require('path');
const fs = require('fs');
const util = require('util');
const crypto = require('crypto');
const mime = require('mime');
//創(chuàng)建http服務(wù)器并監(jiān)聽(tīng)端口
let server = http.createServer();
server.listen(1234, '0.0.0.0', function () {
  console.log('開(kāi)始監(jiān)聽(tīng)');
});
function sendFile(req, res, filePath, eTag) {
  //設(shè)置文件內(nèi)容類(lèi)型
  res.setHeader('Content-Type', mime.getType(filePath));
  //設(shè)置ETag頭信息
  res.setHeader('ETag', eTag);
  //通過(guò)管道將文件數(shù)據(jù)發(fā)送給客戶(hù)端
  fs.createReadStream(filePath).pipe(res);
}
server.on('request', function (req, res) {
  let {pathname} = url.parse(req.url, true);
  //獲取文件真實(shí)路徑
  let filePath = path.join(__dirname, pathname);
  //判斷文件是否存在
  fs.stat(filePath, function (err, stats) {
    if (err) {
      return res.end(util.inspect(err));
    }
    if (!stats.isFile()) {
      return res.end('is not file');
    }
    //獲取客戶(hù)端請(qǐng)求的If-None-Match頭信息
    let ifNoneMatch = req.headers['if-none-match'];
    //創(chuàng)建可讀流
    let rs = fs.createReadStream(filePath);
    //創(chuàng)建md5算法
    let md5 = crypto.createHash('md5');
    rs.on('data', function (data) {
      md5.update(data);
    });
    rs.on('end', function () {
      let eTag = md5.digest('hex');
      if (ifNoneMatch) {
        //判斷eTag與客戶(hù)端發(fā)送過(guò)來(lái)的If-None-Match是否相等
        if (ifNoneMatch == eTag) {
          res.statusCode = 304;
          res.end();
        } else {
          sendFile(req, res, filePath, eTag);
        }
      } else {
        sendFile(req, res, filePath, eTag);
      }
    });
  });
});

五、讓瀏覽器在緩存有效期內(nèi)不用發(fā)請(qǐng)求

Expires 是http1.0的內(nèi)容,用于設(shè)置緩存的有效期,在有效期內(nèi)瀏覽器直接從瀏覽器緩存中獲取數(shù)據(jù)。

Cache-Control 與Expires作用一樣,是http1.1的內(nèi)容,用于指明當(dāng)前資源的有效期,優(yōu)先級(jí)高于Expires。

Cache-Control可以設(shè)置的值 :

1、private 客戶(hù)端可以緩存

2、public  客戶(hù)端和代理服務(wù)器都可以緩存

3、max-age=10 緩存內(nèi)容在10秒后失效

4、no-cache 使用對(duì)比緩存驗(yàn)證,強(qiáng)制向服務(wù)器驗(yàn)證

5、no-store 內(nèi)容都不緩存,強(qiáng)制緩存和對(duì)比緩存都不會(huì)觸發(fā)

const http = require('http');
const url = require('url');
const path = require('path');
const fs = require('fs');
const util = require('util');
const mime = require('mime');
//創(chuàng)建http服務(wù)器并監(jiān)聽(tīng)端口
let server = http.createServer();
server.listen(1234, '0.0.0.0', function () {
  console.log('開(kāi)始監(jiān)聽(tīng)');
});
function sendFile(req, res, filePath, stats) {
  //設(shè)置文件內(nèi)容類(lèi)型
  res.setHeader('Content-Type', mime.getType(filePath));
  //設(shè)置緩存失效時(shí)間60秒
  res.setHeader('Expires', new Date(Date.now() + 60 * 1000).toUTCString());
  //設(shè)置緩存失效時(shí)間60秒
  res.setHeader('Cache-Control', 'max-age=60');
  //通過(guò)管道將文件數(shù)據(jù)發(fā)送給客戶(hù)端
  fs.createReadStream(filePath).pipe(res);
}
server.on('request', function (req, res) {
  let {pathname} = url.parse(req.url, true);
  //獲取文件真實(shí)路徑
  let filePath = path.join(__dirname, pathname);
  //判斷文件是否存在
  fs.stat(filePath, function (err, stats) {
    if (err) {
      return res.end(util.inspect(err));
    }
    if (!stats.isFile()) {
      return res.end('is not file');
    }
    sendFile(req, res, filePath, stats)
  });
});

希望本文所述對(duì)大家node.js程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • node.js使用express框架進(jìn)行文件上傳詳解

    node.js使用express框架進(jìn)行文件上傳詳解

    在本篇內(nèi)容里小編給大家整理了關(guān)于node.js使用express框架進(jìn)行文件上傳的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們跟著學(xué)習(xí)下。
    2019-03-03
  • node.js部署之啟動(dòng)后臺(tái)運(yùn)行forever的方法

    node.js部署之啟動(dòng)后臺(tái)運(yùn)行forever的方法

    今天小編就為大家分享一篇node.js部署之啟動(dòng)后臺(tái)運(yùn)行forever的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • nodejs基礎(chǔ)之常用工具模塊util用法分析

    nodejs基礎(chǔ)之常用工具模塊util用法分析

    這篇文章主要介紹了nodejs基礎(chǔ)之常用工具模塊util用法,結(jié)合實(shí)例形式分析了nodejs核心工具模塊util功能、相關(guān)函數(shù)與使用方法,需要的朋友可以參考下
    2018-12-12
  • Node.js文件操作詳解

    Node.js文件操作詳解

    這篇文章主要介紹了Node.js文件操作詳解,本文講解了處理文件路徑講的一些方法、fs模塊詳細(xì)的使用和介紹等內(nèi)容,需要的朋友可以參考下
    2014-08-08
  • Node卸載超詳細(xì)步驟(附圖文講解!)

    Node卸載超詳細(xì)步驟(附圖文講解!)

    由于之前的node為8.0版本,不太滿(mǎn)足需求,所以需要安裝高版本的node,下面這篇文章主要給大家介紹了關(guān)于Node卸載超詳細(xì)步驟的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • node故障定位頂級(jí)技巧動(dòng)態(tài)追蹤Dynamic?Trace詳解

    node故障定位頂級(jí)技巧動(dòng)態(tài)追蹤Dynamic?Trace詳解

    這篇文章主要為大家介紹了node故障定位頂級(jí)技巧動(dòng)態(tài)追蹤Dynamic?Trace詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • node.js中的http.response.setHeader方法使用說(shuō)明

    node.js中的http.response.setHeader方法使用說(shuō)明

    這篇文章主要介紹了node.js中的http.response.setHeader方法使用說(shuō)明,本文介紹了http.response.setHeader的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • nodejs中的異步編程知識(shí)點(diǎn)詳解

    nodejs中的異步編程知識(shí)點(diǎn)詳解

    在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于nodejs中的異步編程知識(shí)點(diǎn)詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-01-01
  • 利用node+koa+axios實(shí)現(xiàn)圖片上傳和回顯功能

    利用node+koa+axios實(shí)現(xiàn)圖片上傳和回顯功能

    這篇文章為大家詳細(xì)介紹了如何利用node+koa+axios實(shí)現(xiàn)圖片上傳和回顯功能,主要實(shí)現(xiàn)簡(jiǎn)單的圖片上傳和靜態(tài)內(nèi)容的訪問(wèn),感興趣的可以了解一下
    2022-05-05
  • 究竟什么是Node.js?Node.js有什么好處?

    究竟什么是Node.js?Node.js有什么好處?

    這篇文章主要介紹了究竟什么是Node.js?Node.js有什么好處?,為試圖解釋什么是 Node.js,本文將簡(jiǎn)要介紹一些背景信息:它要解決的問(wèn)題,它如何工作,如何運(yùn)行一個(gè)簡(jiǎn)單應(yīng)用程序,最后,Node 在什么情況下是一個(gè)好的解決方案,需要的朋友可以參考下
    2015-05-05

最新評(píng)論

遵义县| 漯河市| 泰和县| 山阳县| 台中市| 凤山市| 普兰店市| 全南县| 桐梓县| 乐至县| 杂多县| 木里| 中卫市| 年辖:市辖区| 武冈市| 牙克石市| 曲松县| 阿坝县| 洮南市| 乌兰察布市| 邢台市| 黄冈市| 特克斯县| 南漳县| 陈巴尔虎旗| 浑源县| 镇远县| 织金县| 张家川| 江山市| 明溪县| 临夏市| 共和县| 紫金县| 叙永县| 腾冲县| 华阴市| 新民市| 佳木斯市| 略阳县| 玉门市|