关于 session

session 是另一种记录客户状态的机制,与 cookie 保存在客户端浏览器不同,session 保存在服务器当中;
当客户端访问服务器时,服务器会生成一个 session 对象,对象中保存的是 key:value 值,同时服务器会将 key 传回给客户端的 cookie 当中;当用户第二次访问服务器时,就会把 cookie 当中的 key 传回到服务器中,最后服务器会吧 value 值返回给客户端。
因此上面的 key 则是全局唯一的标识,客户端和服务端依靠这个全局唯一的标识来访问会话信息数据。

设置 session

我们使用 express-session 模块来设置 session

安装 express-session

1
cnpm install express-session --save

引入 express-session 模块

1
const session=require("express-session");

设置 session

1
session(options);

如下列代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
const express=require("express");
const session=require("express-session");

var app=express();

//配置中间件
app.use(session({
secret: "keyboard cat",
resave: false,
saveUninitialized: true,
cookie: ('name', 'value',{maxAge: 5*60*1000,secure: false})
}));

app.use('/login',function(req,res){
//设置session
req.session.userinfo='张三';
res.send("登陆成功!");
});

app.use('/',function(req,res){
//获取session
if(req.session.userinfo){
res.send("hello "+req.session.userinfo+",welcome");
}else{
res.send("未登陆");
}
});

app.listen(8080);

在 session(option)中对 session 进行设置

session 的常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
//设置session
req.session.username="张三"

//获取session
req.session.username

//重新设置cookie的过期时间
req.session.cookie.maxAge=1000;

//销毁session
req.session.destroy(function(err){

})

以下演示通过销毁 session 的方式来退出登录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
const express=require("express");
const session=require("express-session");

var app=express();

//配置中间件
app.use(session({
secret: "keyboard cat",
resave: false,
saveUninitialized: true,
cookie: ('name', 'value',{ maxAge: 5*60*1000,
secure: false,
name: "seName",
resave: false})
}));

app.use('/login',function(req,res){
//设置session
req.session.userinfo='张三';
res.send("登陆成功!");
});

app.use('/loginOut',function(req,res){
//注销session
req.session.destroy(function(err){
res.send("退出登录!"+err);
});
});

app.use('/',function(req,res){
//获取session
if(req.session.userinfo){
res.send("hello "+req.session.userinfo+",welcome to index");
}else{
res.send("未登陆");
}
});

app.listen(8080);

当我们进入到主页时,未显示任何信息,进入 login 路由后,自动设置 session,这是回到主页则显示 session 信息,之后进入 loginOut 路由已注销 session 信息,再回到首页显示为登陆。