摘要:最近在研究,學(xué)著使用,開始不會(huì)用,就百度了一下,沒有百度到特別完整的解答。查閱了的,綜合了網(wǎng)友的博客,解讀了的源碼,以及使用和驗(yàn)證,終于明白了中的使用。默認(rèn)為網(wǎng)站域名過期時(shí)間,類型為。使用插件,后續(xù)代碼直接使用或者即可
最近在研究express,學(xué)著使用cookie,開始不會(huì)用,就百度了一下,沒有百度到特別完整的解答。查閱了express的API,綜合了網(wǎng)友的博客,解讀了cookie-parser的源碼,以及使用WebStorm和Chrome驗(yàn)證,終于明白了express中cookie的使用。顧此篇文章即是分享也是總結(jié)。
1. cookie的創(chuàng)建
express直接提供了api,只需要在需要使用的地方調(diào)用如下api即可
function(req, res, next){ ... res.cookie(name, value [, options]); ... }
express就會(huì)將其填入Response Header中的Set-Cookie,達(dá)到在瀏覽器中設(shè)置cookie的作用。
name: 類型為String
value: 類型為String和Object,如果是Object會(huì)在cookie.serialize()之前自動(dòng)調(diào)用JSON.stringify對(duì)其進(jìn)行處理
Option: 類型為對(duì)象,可使用的屬性如下
domain:cookie在什么域名下有效,類型為String,。默認(rèn)為網(wǎng)站域名 expires: cookie過期時(shí)間,類型為Date。如果沒有設(shè)置或者設(shè)置為0,那么該cookie只在這個(gè)這個(gè)session有效,即關(guān)閉瀏覽器后,這個(gè)cookie會(huì)被瀏覽器刪除。 httpOnly: 只能被web server訪問,類型Boolean。 maxAge: 實(shí)現(xiàn)expires的功能,設(shè)置cookie過期的時(shí)間,類型為String,指明從現(xiàn)在開始,多少毫秒以后,cookie到期。 path: cookie在什么路徑下有效,默認(rèn)為"/",類型為String secure:只能被HTTPS使用,類型Boolean,默認(rèn)為false signed:使用簽名,類型Boolean,默認(rèn)為false。`express會(huì)使用req.secret來完成簽名,需要cookie-parser配合使用`
上面是我結(jié)合實(shí)驗(yàn)和自己的理解,對(duì)官網(wǎng)api的翻譯。原英文如下:
用例如下
res.cookie("name", "koby", { domain: ".example.com", path: "/admin", secure: true }); //cookie的有效期為900000ms res.cookie("rememberme", "1", { expires: new Date(Date.now() + 900000), httpOnly: true }); //cookie的有效期為900000ms res.cookie("rememberme", "1", { maxAge: 900000, httpOnly: true }); //cookie的value為對(duì)象 res.cookie("cart", { items: [1,2,3] }); res.cookie("cart", { items: [1,2,3] }, { maxAge: 900000 }); res.cookie("name", "tobi", { signed: true });
2.cookie的刪除
express直接提供了api刪除瀏覽器中的cookie,只需要在需要使用的地方調(diào)用如下api即可
function(req, res, next){ ... res.clearCookie(name [, options]); ... }
3.利用cookie-parser讀取cookie
cookie-parser是一個(gè)非常好用方便的插件,可以直接用在express和connect中,官文地址為https://www.npmjs.com/package/cookie-parser。npm安裝命令
$npm install cookie-parser --save
使用方式
var express = require("express"); var cookieParser = require("cookie-parser"); var app = express(); //不使用簽名 app.use(cookiePareser()); //若需要使用簽名,需要指定一個(gè)secret,字符串,否者會(huì)報(bào)錯(cuò) app.use(cookiePareser("Simon"));
如果沒有為signed功能,cookie-parser通過如下代碼解析req.headers.cookie
//index.js var cookie = require("cookie"); var parse = require("./lib/parse"); if (req.cookies) return next(); //如果存在req.cookies跳過這個(gè)middleware var cookies = req.headers.cookie; //保存對(duì)象地址,提高運(yùn)行效率 req.cookies = Object.create(null); //創(chuàng)建一個(gè)對(duì)象,解析后的且未使用簽名的cookie保存在req.cookies中 req.cookies = cookie.parse(cookies); //與express中調(diào)用cookie.serialize()對(duì)應(yīng),解析cookie req.cookies = JSONCookies(req.cookies); // JSON字符序列轉(zhuǎn)化為JSON對(duì)象
//./lib/parse.js //接續(xù)cookie中的JSON字符序列 exports.JSONCookies = function(obj){ var cookies = Object.keys(obj); //獲取obj對(duì)象的property var key; var val; //循環(huán)判斷并解析 for (var i = 0; i < cookies.length; i++) { key = cookies[i]; val = exports.JSONCookie(obj[key]); //如果是JSON字符序列則保存 if (val) { obj[key] = val; } } return obj; }; //解析JSON字符序列 exports.JSONCookie = function(str) { if (!str || str.substr(0, 2) !== "j:") return; //判斷是否為JSON字符序列,如果不是返回undefined try { return JSON.parse(str.slice(2)); //解析JSON字符序列 } catch (err) { // no op } };
如果使用了signed功能,cookie-parser通過如下代碼解析req.headers.cookie
//index.js var cookie = require("cookie"); var parse = require("./lib/parse"); if (req.cookies) return next(); //如果存在req.cookies跳過這個(gè)middleware //調(diào)用res.cookie(name, value , {singed: true}),express會(huì)使用req.secret。故使用了簽名功能,需給cookie-parser傳遞secret,且res.cookie(name, value , {singed: true})需在cookie-parser插 //入express后再使用 req.secret = secret; req.cookies = Object.create(null); req.signedCookies = Object.create(null); //創(chuàng)建req.singedCookies,所有解析后的signed cookie都保存在這個(gè)對(duì)象中,req.cookies中沒有任何signed cookie // 如果請(qǐng)求中沒有cookies if (!cookies) { return next(); } req.cookies = cookie.parse(cookies, options); //與express中調(diào)用cookie.serialize()對(duì)應(yīng),解析cookie // parse signed cookies if (secret) { //判斷是否為singed cookie。如果是,則去掉簽名,同時(shí)刪除req.cookies中對(duì)應(yīng)的property,將這些去掉簽名的cookie組成一個(gè)對(duì)象,保存在req.signedCookies中 req.signedCookies = parse.signedCookies(req.cookies, secret); // JSON字符序列轉(zhuǎn)化為JSON對(duì)象 req.signedCookies = parse.JSONCookies(req.signedCookies); }
//./lib/parse.js var signature = require("cookie-signature"); exports.signedCookies = function(obj, secret){ var cookies = Object.keys(obj); //獲取obj對(duì)象的property var dec; var key; var ret = Object.create(null); //創(chuàng)建返回對(duì)象 var val; for (var i = 0; i < cookies.length; i++) { key = cookies[i]; val = obj[key]; dec = exports.signedCookie(val, secret); //判斷是否是去掉簽名后的value,如果是保存該值到ret中同時(shí)刪除obj中的相應(yīng)property if (val !== dec) { ret[key] = dec; delete obj[key]; } } return ret; }; exports.signedCookie = function(str, secret){ //判斷是否添加了簽名,如果添加了簽名則去掉簽名,否則返回原字符串 return str.substr(0, 2) === "s:" ? signature.unsign(str.slice(2), secret) : str; };
綜上所訴,解析后的unsigned cookie保存在req.cookies中,而解析后的signed cookie只保存在req.signedCookies中。使用cookie-parser插件,后續(xù)代碼直接使用req.cookies或者req.signedCookies即可
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/78299.html
摘要:簡(jiǎn)介是最常使用的中間件實(shí)際上雖然他名義上是一個(gè)中間件但是實(shí)際上已經(jīng)儼然成為了的一個(gè)不可或缺的部分在的文檔中操作的部分就一個(gè)方法和一個(gè)屬性但是實(shí)際上如果你不使用中間件這些方法是根本就不存在的先從操作說起如果有一個(gè)純凈的像這樣我們?nèi)绾尾倏v顯 簡(jiǎn)介 cookie-parser是Express最常使用的中間件,實(shí)際上雖然他名義上是一個(gè)中間件但是實(shí)際上已經(jīng)儼然成為了Express的一個(gè)不可或缺的...
摘要:當(dāng)會(huì)話過期或被放棄后,服務(wù)器將終止該會(huì)話。原來中間件生成的是一個(gè)對(duì)象,里面包含了信息。這個(gè)有一個(gè)過期時(shí)間,比如,上面代碼中設(shè)置的是小時(shí)。也就是說,小時(shí)后,這個(gè)在瀏覽器中會(huì)自動(dòng)消失。 前言 在上一篇中node中的cookie,對(duì)cookie進(jìn)行了相關(guān)介紹,本篇將繼續(xù)前行,對(duì)session進(jìn)行說明。 session是什么 session不就是會(huì)話嘛,那什么是會(huì)話呢?會(huì)話是一個(gè)比連接粒度更大...
摘要:當(dāng)會(huì)話過期或被放棄后,服務(wù)器將終止該會(huì)話。原來中間件生成的是一個(gè)對(duì)象,里面包含了信息。這個(gè)有一個(gè)過期時(shí)間,比如,上面代碼中設(shè)置的是小時(shí)。也就是說,小時(shí)后,這個(gè)在瀏覽器中會(huì)自動(dòng)消失。 前言 在上一篇中node中的cookie,對(duì)cookie進(jìn)行了相關(guān)介紹,本篇將繼續(xù)前行,對(duì)session進(jìn)行說明。 session是什么 session不就是會(huì)話嘛,那什么是會(huì)話呢?會(huì)話是一個(gè)比連接粒度更大...
摘要:簡(jiǎn)介是中的一個(gè)處理的中間件可以說是中最常見的中間件之一了由于會(huì)話管理依賴的使用所以它的中有很多用于控制的部分總的來說有如下的特點(diǎn)管理基本功能簽名可替換持久儲(chǔ)存模塊本文中使用的版本為安裝引入使用使用簽名這個(gè)屬性是必須的具體配置和 簡(jiǎn)介 express-session是express中的一個(gè)處理session的中間件,可以說是express中最常見的中間件之一了. 由于會(huì)話管理依賴cook...
閱讀 920·2019-08-30 15:54
閱讀 1481·2019-08-30 15:54
閱讀 2409·2019-08-29 16:25
閱讀 1303·2019-08-29 15:24
閱讀 756·2019-08-29 12:11
閱讀 2513·2019-08-26 10:43
閱讀 1238·2019-08-26 10:40
閱讀 478·2019-08-23 16:24