express学习(三)—— cookie和session
cookie存在浏览器中,最大只能保存4K数据,不安全
session存在服务器中,不能独立(先读取cookie再读取session),较安全
cookie
工具
发送cookie:
基本的东西先写好:
const express = require('express');
var server=express();
// cookie
server.use('/',function(req,res){
res.cookie('名字', '值', {path: '/aaa/a.html', maxAge: 30*24*3600*1000}); //path指明谁可以访问,‘/aaa/a.html'表示根目录下aaa文件夹中的a.html文件;maxAge表示最长保留时间(以毫秒计)
})
server.listen(8080)
读取cookie
接着,用cookie-parser工具
const express=require('express');
const cookieParser=require('cookie-parser');
var server=express();
//cookie
server.use(cookieParser());
server.use('/', function (req, res){
console.log(req.cookies);
res.send('ok');
});
server.listen(8080);
执行结果:
但是cookie分为两种,加密的(有签名的)、不加密的(没有签名的)。
const express=require('express');
const cookieParser=require('cookie-parser');
var server=express();
//cookie
server.use(cookieParser('wesdfw4r34tf'));
server.use('/', function (req, res){
req.secret = 'wesdfw4r34tf'; //有了上面的’server.use(cookieParser('wesdfw4r34tf'));‘,这里的req.secret可以不写。因为cookie会自动传值给secret
res.cookie('user', 'blue', {signed: true});
console.log('签名cookie:', req.signedCookies,'
')
console.log('无签名cookie:', req.cookies);
res.send('ok');
});
server.listen(8080);
执行结果:
一定要把签名的内容告诉cookieParser,如server.use(cookieParser('wesdfw4r34tf'));
,否则它不知道解读谁,就会返回很长一串,如图所示的结果:
删除cookie
一条语句就足够
res.clearCookie('名字');
session
用到一个中间件:cookie-session:
npm install cookie-session --save
const express=require('express');
const cookieParser=require('cookie-parser');
const cookieSession=require('cookie-session');
var server = express();
server.use(cookieParser());
server.use(cookieSession({
name:'my_session',
keys:['aaa','bbb','ccc'], //数组越长越安全
maxAge:2*3600*1000 // 保存两小时
}));
server.use('/',function(req,res){
if(req.session['count']==null){
req.session['count']=1;
}else{
req.session['count']+=1;
}
console.log(req.session['count'])
res.send('ok');
})
server.listen(8080);
把密钥数组增大:
var arr=[];
for(var i=0;i<100000;i++){
arr.push('sig_'+Math.random());
}
server.use(cookieParser());
server.use(cookieSession({
name:'my_session',
keys:arr, //用到上面的数组
maxAge:2*3600*1000 // 保存两小时
}));
总结
server.use(cookieParser('签名字符串'));
server.use(cookieSession({
}));
server.use(function (req, res){
//发送cookie
res.cookie(名字, 值, {signed: true});
//读取cookie
res.cookies['user']
//删除cookie
res.clearCookie('名字');
//获取session
res.session['xxx']
//删除session
delete res.session['xxx'];
});
为什么delete不可以删除cookie?
因为cookie存在浏览器端,而session是存在服务器端,所以只有session才可以使用delete方法删除。