我用express-session redis-conect这两个通用的方案来弄sesion的时候一直无效,然后我测试了cookie发现可以正常使用,行,那只能自己实现session了,
在express的脚手架环境下再准备好以下模块
"redis": "^2.4.2",
"uuid": "^3.2.1"
登录成功的逻辑中设置cookie
var UUID=require('uuid')
var token='token'+UUID.v1()
var redis = require('redis');
var client = redis.createClient(config.redis_port,config.redis_host);
client.on('connect',()=>{
client.hmset(token, {
"expires":Date.now()+config.token_expires_time, // NOTE: key and value will be coerced to strings
"user": JSON.stringify(user)
});
res.cookie('token',token,{ expires:new Date(Date.now()+config.token_expires_time), httpOnly: true });
return res.render('sign/signin', {success: '登陆成功'});
})
编写一个中间件
//判段用户是否登录
app.use(function(req,res,next){
if(req.cookies.token){
var redis = require('redis');
var client = redis.createClient(config.redis_port,config.redis_host);
client.on('connect',()=>{
//将键值放入redis中进行查询
client.hgetall(req.cookies.token, function (err, obj) {
//以过期,被定时任务清除
if(obj!=null){
global.current_user=JSON.parse(obj.user)
}else{
global.current_user=false
res.cookie('token','')
}
next()
});
})
}
else{
global.current_user=false
next()
}
})
退出登录
if(req.cookies.token){
var redis = require('redis');
var client = redis.createClient(config.redis_port,config.redis_host);
client.on('connect',()=>{
client.del(req.cookies.token,(err,response)=>{
if (err) return false;
res.cookie('token','')
res.redirect('/');
})
})
}
再加上脚本定时清除过期的session。搞定