作者:平凡特产小店 | 来源:互联网 | 2023-07-02 17:45
最近在研讨express,学着运用cookie,最先不会用,就百度了一下,没有百度到迥殊完全的解答。查阅了express的API,综合了网友的博客,解读了cookie-parser
最近在研讨express,学着运用COOKIE,最先不会用,就百度了一下,没有百度到迥殊完全的解答。查阅了express的API,综合了网友的博客,解读了COOKIE-parser的源码,以及运用WebStorm和Chrome考证,终究邃晓了express中COOKIE的运用。顾此篇文章等于分享也是总结。
1. COOKIE的建立
express直接供应了api,只须要在须要运用的处所挪用以下api即可
function(req, res, next){
...
res.COOKIE(name, value [, options]);
...
}
express就会将其填入Response Header中的Set-COOKIE,到达在浏览器中设置COOKIE的作用。
name: 范例为String
value: 范例为String和Object,假如是Object会在COOKIE.serialize()之前自动挪用JSON.stringify对其举行处置惩罚
Option: 范例为对象,可运用的属性以下
domain:COOKIE在什么域名下有用,范例为String,。默以为网站域名
expires: COOKIE逾期时候,范例为Date。假如没有设置或许设置为0,那末该COOKIE只在这个这个session有用,即封闭浏览器后,这个COOKIE会被浏览器删除。
httpOnly: 只能被web server接见,范例Boolean。
maxAge: 完成expires的功用,设置COOKIE逾期的时候,范例为String,指明从现在最先,若干毫秒今后,COOKIE到期。
path: COOKIE在什么途径下有用,默以为'/',范例为String
secure:只能被HTTPS运用,范例Boolean,默以为false
signed:运用署名,范例Boolean,默以为false。`express会运用req.secret来完成署名,须要COOKIE-parser合营运用`
上面是我连系试验和本身的明白,对官网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为对象
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,只须要在须要运用的处所挪用以下api即可
function(req, res, next){
...
res.clearCOOKIE(name [, options]);
...
}
3.应用COOKIE-parser读取COOKIE
COOKIE-parser是一个异常好用轻易的插件,能够直接用在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());
//若须要运用署名,须要指定一个secret,字符串,否者会报错
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跳过这个middleware
var COOKIEs = req.headers.COOKIE; //保留对象地点,进步运转效力
req.COOKIEs = Object.create(null); //建立一个对象,剖析后的且未运用署名的COOKIE保留在req.COOKIEs中
req.COOKIEs = COOKIE.parse(COOKIEs); //与express中挪用COOKIE.serialize()对应,剖析COOKIE
req.COOKIEs = JSONCOOKIEs(req.COOKIEs); // JSON字符序列转化为JSON对象
//./lib/parse.js //继续COOKIE中的JSON字符序列
exports.JSOnCOOKIEs= function(obj){
var COOKIEs = Object.keys(obj); //猎取obj对象的property
var key;
var val; //轮回推断并剖析
for (var i = 0; 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跳过这个middleware //挪用res.COOKIE(name, value , {singed: true}),express会运用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); //建立req.singedCOOKIEs,一切剖析后的signed COOKIE都保留在这个对象中,req.COOKIEs中没有任何signed COOKIE
// 假如要求中没有COOKIEs
if (!COOKIEs) {
return next();
}
req.COOKIEs = COOKIE.parse(COOKIEs, options); //与express中挪用COOKIE.serialize()对应,剖析COOKIE
// parse signed COOKIEs
if (secret) {
//推断是不是为singed COOKIE。假如是,则去掉署名,同时删除req.COOKIEs中对应的property,将这些去掉署名的COOKIE构成一个对象,保留在req.signedCOOKIEs中
req.signedCOOKIEs = parse.signedCOOKIEs(req.COOKIEs, secret);
// JSON字符序列转化为JSON对象
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对象的property
var dec;
var key;
var ret = Object.create(null); //建立返回对象
var val; for (var i = 0; i key = COOKIEs[i];
val = obj[key];
dec = exports.signedCOOKIE(val, secret); //推断是不是是去掉署名后的value,假如是保留该值到ret中同时删除obj中的响应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插件,后续代码直接运用req.COOKIEs或许req.signedCOOKIEs即可