您的位置:首页 > Web前端 > Node.js

关于nodejs中cookie和session浅谈

2017-02-22 00:00 344 查看
摘要: cookie,session作用,以及在nodejs中如何操作和利用cookie和session

对于cookie和session一直都略有疑惑,最近学习nodejs,所以特意查了下关于这方面的东西并且记载一下。

由于最近学习nodejs,新建一个群,人数不多还,欢迎愿意一起学习一起进步的朋友们加入:nodejs技术1群,群号码:209530601

我们都知道,http是不带用户状态信息的,也就是说我第一次请求这个服务器,和第二次请求同一个服务器,浏览器是不知道这两次请求是同一个人的。当然,如果是需要登录的网站,这里第二次我们就需要重新登录了

所以,这里就出现了我们所要说的cookie和session,关于cookie和session不是本篇的重点,这里我们简单的说明下,然后重点说下nodejs中关于cookie和session的操作。

什么是session,什么是cookie

简单的来说,cookie是通过服务器在浏览器中设置的一个标识,而session是存储在服务器里面的一个标识。但是毕竟是标识依旧是浏览器过来的请求,所以session 的出现还是得依旧cookie。

cookie的发送是通过扩展的http协议来发送,服务器通过在HTTP的响应头中加上一行特殊的指示以提示

浏览器按照指示生成相应的cookie。cookie的内容主要包括,名字,值,过期时间,域一起构成,如果不设置过期时间,则在这次浏览器关闭窗口的时候就过期了,这种cookie我们通常称之为会话cookie。会话cookie并没有保存在硬盘中,而是存储在内存里,感觉怪怪的哈,也就必须的这种行为并不是规范的行为。 如果设置了过期时间,这个cookie会保存在硬盘里,直到过期之前都是有效的。

而session是通过cookie生成的一个存储在服务端的一个标识。在浏览器请求的时候会首先检查浏览器是否带有一个session_id加密的cookie,如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来,并且使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。

session和cookie的区别

相信说到这里,大家已经知道session和cookie的作用,那么简单说下这两个的区别

cookie数据存放在客户的浏览器上,session数据放在服务器上。

cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 考虑到安全应当使用session。

session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能 考虑到减轻服务器性能方面,应当使用COOKIE。

单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

所以建议:将登陆信息等重要信息存放为session、其他信息如果需要保留,可以放在cookie中

在nodejs中如何使用cookie和session(这里我们用到的是express框架)



如上我们可以通过res.cookie()的方法来设置cookie,这时候我们看浏览器就有了我们的cookie信息:



当然,这里我们也可以给cookie加上点选项如下:

/**
* Created by Nealyang on 17/2/22.
*/
const express = require('express');
var app = express();
app.listen(8080);

app.get('/',function (req,res) {
res.cookie('name','Nealyang',{
path:'/aaa',//访问哪一个路径的时候我们给你加上cookie
maxAge:20*60*1000//cookie的存活时间,单位毫秒

});
res.send('ok');
});

然后,我们该如何获取cookie呢,这时候需要用到express的一个中间件:cookie-parser

/**
* Created by Nealyang on 17/2/22.
*/
const express = require('express');
const cookieParser = require('cookie-parser');
var app = express();
app.listen(8080);

app.use(cookieParser());

app.get('/',function (req,res) {
res.cookie('name','Nealyang',{
path:'/aaa',//访问哪一个路径的时候我们给你加上cookie
maxAge:20*60*1000//cookie的存活时间,单位毫秒

});
res.send(req.cookies);
});

这个时候,从浏览器上就可以看到我们之前的cookie



当然,如此暴露在外的cookie必然是不好的,虽然它本身就是不安全的哈,我们可以通过对cookie进行签名,来加密它,然后再获取的时候,我们需要告诉req,我们是需要签名后的cookie,还是没有签名的cookie,代码如下:

/**
* Created by Nealyang on 17/2/22.
*/
const express = require('express');
const cookieParser = require('cookie-parser');
var app = express();
app.listen(8080);

app.use(cookieParser('这段签名的字符串可以是随意的'));

app.get('/',function (req,res) {
res.secret='这段签名的字符串可以是随意的';
res.cookie('name','Nealyang',{
path:'/',//访问哪一个路径的时候我们给你加上cookie
maxAge:20*60*1000,//cookie的存活时间,单位毫秒
signed:true//是否加签名
});
console.log('没有签名的cookie:',req.cookies);
console.log('签名后的cookie:',req.signedCookies);
res.send(req.cookies);
});

最后获取的结果如下:



session的删除也是非常的简单:res.clearCookie('name')就可以了

下面说下session:

session是机遇cookie生成出来的,这里需要用到的是cookie-session中间件,需要注意的是,由于session是相对于比较机密一点的,所以在这是他的时候,我们需要个额外的给他一个keys用于加密,而且,必须在cookie-parse下面,基本用法如下:

/**
* Created by Nealyang on 17/2/22.
*/
const express = require('express');
const cookieParser = require('cookie-parser');
const cookieSeesion = require('cookie-session');
var app = express();
app.listen(8080);

app.use(cookieParser('这段签名的字符串可以是随意的'));
(function () {
var arr = [];
for(var i = 0;i<10000;i++){
arr.push('keys_'+Math.random());
}
app.use(cookieSeesion({
keys:arr,
name:'session_id',//加密的cookie的名字,最后通过这个来从服务端查找到对应的人
maxAge:20*60*1000
}))
})();

app.get('/',function (req,res) {
console.log(req.session['test']);
if(typeof req.session['test'] == 'undefined'){
req.session['test'] = 'haha';
res.send('这是第一次访问');
}else{
res.send('这不是第一次访问');
}
});

打印结果如下:



当然,删除的时候,由于session是存储服务器的东西,所以我们可以直接用delete,delete res.session['名字']

关于session和cookie的暂时就先说这么多,后面打算再结合点例子,再次练习练习。

顺便说下,cookie的secret只是给cookie签名,并不是加密,因为我始终觉得不安全的东西,容易篡改的东西加密没有必要,况且cookie的存储空间有限,如果需要加密的话,可以用cookie-encryption中间件。

OK,最后说下,欢迎加入nodejs菜鸟群,一起学习,一起进步:nodejs技术1群,群号码:209530601
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息