热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

express中cookie的运用和cookieparser的解读

最近在研讨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的翻译。原英文以下:

《express中COOKIE的运用和COOKIE-parser的解读》

用例以下

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即可


推荐阅读
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • ScrollView嵌套Collectionview无痕衔接四向滚动,支持自定义TitleView
    本文介绍了如何实现ScrollView嵌套Collectionview无痕衔接四向滚动,并支持自定义TitleView。通过使用MainScrollView作为最底层,headView作为上部分,TitleView作为中间部分,Collectionview作为下面部分,实现了滚动效果。同时还介绍了使用runtime拦截_notifyDidScroll方法来实现滚动代理的方法。具体实现代码可以在github地址中找到。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • .NetCoreWebApi生成Swagger接口文档的使用方法
    本文介绍了使用.NetCoreWebApi生成Swagger接口文档的方法,并详细说明了Swagger的定义和功能。通过使用Swagger,可以实现接口和服务的可视化,方便测试人员进行接口测试。同时,还提供了Github链接和具体的步骤,包括创建WebApi工程、引入swagger的包、配置XML文档文件和跨域处理。通过本文,读者可以了解到如何使用Swagger生成接口文档,并加深对Swagger的理解。 ... [详细]
  • 本文介绍了NetCore WebAPI开发的探索过程,包括新建项目、运行接口获取数据、跨平台部署等。同时还提供了客户端访问代码示例,包括Post函数、服务器post地址、api参数等。详细讲解了部署模式选择、框架依赖和独立部署的区别,以及在Windows和Linux平台上的部署方法。 ... [详细]
author-avatar
平凡特产小店
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有