一、关于session
session是另一种记录客户状态的机制,与cookie保存在客户端浏览器不同,session保存在服务器当中;当客户端访问服务器时,服务器会生成一个session对象,对象中保存的是key:value值,同时服务器会将key值写入到cookie中,客户端的将cookie保存到本地;当用户后续访问服务器时,会携带cookie中的key值,服务器通过key获取到对应的value值。value值中可以保存当前登录用户的信息,客户端和服务端依靠这个全局唯一的标识key来维护会话状态。因此上面的key则是全局唯一的标识。
二、使用session
2.1 安装express-session
cnpm install express-session --save
2.2 引入express-session模块
var session = require("express-session");
2.3 配置session
app.use(session({
secret: "123456",
resave: false,
saveUninitialized: true,
rolling:true,//是否每次访问服务器要更新cookie的过期时间(更新cookie的时间其实就是延长了session的保存时间)
cookie: ({
maxAge: 5*60*1000, //cookie过期时间
secure: false//如果设置为true只有在请求协议为https时服务才可以获取session
})
}))
express-session 常用参数
**
参数 | 作用 |
---|---|
secret | 一个 String 类型的字符串,作为服务器端生成 session 的签名。 |
name | 返回客户端的 key 的名称,默认为 connect.sid,也可以自己设置。 |
resave | 强制保存 session 即使它并没有变化,。默认为 true。建议设置成 false。 don’t save session if unmodified |
saveUninitialized | 强制将未初始化的 session 存储。当新建了一个 session 且未设定属性或值时,它就处于未初始化状态。在设定一个 cookie 前,这对于登陆验证,减轻服务端存储压力,权限控制是有帮助的。(默 认:true)。建议手动添加。 |
cookie | 设置返回到前端 key 的属性,默认值为{ path: ‘/’, httpOnly: true, secure: false, maxAge: null }。 |
rolling | 在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认:false) |
2.4 演示代码
var express = require('express');
var session = require("express-session");
var app = express();
app.use(session({
secret: "123456",
resave: false,
saveUninitialized: true,
rolling:true,//是否每次访问服务器要更新cookie的过期时间(更新cookie的时间其实就是延长了session的保存时间)
cookie: ({
maxAge: 5*60*1000, //cookie过期时间
secure: false//如果设置为true只有在请求协议为https时服务才可以获取session
})
}))
//访问该路由时,判断用户是否已登录
app.get('/',function(req,res){
//获取session
if(req.session.username){
res.send('已登录:' + req.session.username);
}else{
res.send("未登陆");
}
});
app.get('/login',function(req,res){
//设置session
req.session.username='Smith';
res.send("登陆成功!");
});
module.exports = app;
三、session的常用方法
//销毁session
req.session.destroy(function(err) { })
//设置 session
req.session.username='小明';
//获取 session
var username = req.session.username;
//重新设置 cookie 的过期时间
req.session.cookie.maxAge=1000;
3.1 销毁session
用销毁session的方式演示退出登录。
添加一个‘/logout’ 路由
var express = require('express');
var session = require("express-session");
var app = express();
app.use(session({
secret: "123456",
resave: false,
saveUninitialized: true,
rolling:true,//是否每次访问服务器要更新cookie的过期时间(更新cookie的时间其实就是延长了session的保存时间)
cookie: ({
maxAge: 5*60*1000, //cookie过期时间
secure: false//如果设置为true只有在请求协议为https时服务才可以获取session
})
}))
//访问该路由时,判断用户是否已登录
app.get('/',function(req,res){
//获取session
if(req.session.username){
res.send('已登录:' + req.session.username);
}else{
res.send("未登录");
}
});
app.get('/login',function(req,res){
//设置session
req.session.username='Smith';
res.send("登录成功!");
});
app.get('/logout',function(req,res){
//销毁session
req.session.destroy(function(err){
if(err){
res.send(err);
}else{
res.send("已退出!");
}
});
})
module.exports = app;
访问路由‘/’显示“未登录”
访问路由‘/login’显示“登录成功”
再访问路由‘/’,显示“已登录:Smith”
访问路由‘/logout’,显示“已退出!”
再访问路由‘/’,显示“未登录”