express 实现session
原创
©著作权归作者所有:来自51CTO博客作者朋克版小红帽的原创作品,请联系作者获取转载授权,否则将追究法律责任
1) session工作过程
1)用户登录后 把sessionID保存到Cookie中
2)用户在请求网站别的服务器的时候 由浏览器请求带上cookie发送到服务器
3)服务器拿到sessionID后 通过该ID 找到保存在服务器的用户信息
4)拿到用户信息进行处理
2)express-session 配置参数
name -cookie的名字
store -session 存储实例
cookie -session cookie设置(设置路径和时间等)
rollong -session 过期时间
具体参数可以看这个
https://www.jianshu.com/p/86cf320bd58d
属性
| 说明
|
cookie | 默认值 { path: '/', httpOnly: true, secure: false, maxAge: null } |
domain | cookie 可以设置的域名,如果没有设置则cookie默认在当前域可以使用 |
expires | cookie 失效时间,可以设置时间,不建议给固定时间,设置maxAge 之后自动会生成这个值 |
httpOnly | 属性禁止客户端JavaScript 的访问,禁止后不能使用document.cookie |
maxAge | 设置cookie 开始多少毫秒失效 |
path | 默认值为域名的根路径
|
secure | 为true ,https 才传递到服务器端。http 是不会传递的 |
genid | 设置创建session id 的自定义函数,默认使用 uid-safe 扩展来生成id,一定要保证创建的id不要重复。 |
name | 在response 中sessionID 这个cookie的名称 ,即set-cookie 中sessionID 的key ,看一下源码片段:name = options.name or options.key or connect.sid //很显然cookie的name默认是connect.sid ,而且首先获取到的name 而不是key |
resave | 强制session 保存到session store 中 即使没有发生变化,默认为false 。 知道你的store 是否需要设置resave 的方法是通过查看你的store 是否实现了touch方法(删除那些空闲的session 。同时这个方法也会通知session store 指定的session 是活动态的),如果实现了那么你可以用resave:false ,如果没有实现touch 方法,同时你的store 对保存的session 设置了一个过期的时间,那么建议你用resave:true |
rolling | 在每次请求时强行设置cookie ,这将重置cookie 过期时间(默认:false ), 强制在每一个response 中都发送session 标识符的cookie ,即每次的response 都带有set-cookie 属性,使得客户端每次都重新设置cookie 。 如果把这个值设置为true但是saveUnitialized设置为false,那么cookie不会被包含在响应中(没有初始化的session) |
saveUninitialized | 强制存储未初始化的session (默认为true ,建议手动添加) |
secret | 用来注册session id 到cookie 中,相当与一个密钥 |
store | session 存储的实例子,一般可以用redis 和mangodb 来实现 |
unset | 默认是keep ,设置req.session 在什么时候可以设置。 destory :请求结束时候session摧毁,keep : session 在存储中的值不变,在请求之间的修改将会忽略,而不保存 。 |
3)express session的使用
npm install express-session 安装
4)在app里配置session
引用
var session =require('express-session')
设置
app.use(cookieParser('mySystem'));
app.use(session(
{
secret:"mySystem",//与cookieParser 的值要一样
cookie:{maxAge:5000},//作用时间 单位毫秒 5000就是5秒
rolling:true,//只要操作有响应 就会刷新这个时间 不然会总断
resave: false, //添加 resave 选项
saveUninitialized: true //添加 saveUninitialized 选项
}))
在登录路由上
router.post('/login',function(req,res,next)
{
var username = req.body.username;
var password = req.body.password;
db.query('select * from loginuser where username=? and password=?',[username,password],function(err,results)
{
if(err)
{
console.log(err);
}else if(results.length>0)
{
//自己定义is_login属性
req.session.is_login=true;
//界面转到index界面
res.render('sys_index.ejs',{username:results[0]['userName']});
}
})
})
在回到app.js
一定要注意位置 不然会引起问题
app.use(express.static(path.join(__dirname, 'public')));
//注意位置 要写在静态加载路径的下面 其他处理的上面
app.use(function(req,res,next)
{
if(req.session.is_login)
{
//往下执行
next();
}else if(req.url=='/'||req.url=='/login')
{
next();
}else
{
res.write("<script>parent.location.href='/'</script>")
}
})
效果
等路后 等5秒(设置了5秒) 再点击任何地方都会返回到登录界面
稳~