一、关于session
session是另一种记录客户状态的机制,与cookie保存在客户端浏览器不同,session保存在服务器当中;
当客户端访问服务器时,服务器会生成一个session对象,对象中保存的是key:value值,同时服务器会将key传回给客户端的cookie当中;当用户第二次访问服务器时,就会把cookie当中的key传回到服务器中,最后服务器会吧value值返回给客户端。
因此上面的key则是全局唯一的标识,客户端和服务端依靠这个全局唯一的标识来访问会话信息数据。
二、设置session
我们使用express-session模块来设置session
1.安装express-session
1
|
cnpm install express-session --save
|
2.引入express-session模块
1
|
const session=require( "express-session" );
|
3.设置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
|
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进行设置,它的主要参数是:
1
2
3
4
5
6
7
8
9
10
11
|
1. name - cookie的名字(原属性名为 key)。(默认:’connect.sid’)
2. store - session存储实例
3. secret - 用它来对session cookie签名,防止篡改
4. cookie - session cookie设置 (默认:{ path: ‘/‘, httpOnly: true ,secure: false , maxAge: null })
5. genid - 生成新session ID的函数 (默认使用uid2库)
6. rolling - 在每次请求时强行设置cookie,这将重置cookie过期时间(默认: false )
7. resave - 强制保存session即使它并没有变化 (默认: true , 建议设为: false )
8. proxy - 当设置了secure cookies(通过”x-forwarded-proto” header )时信任反向代理。当设定为 true 时,
”x-forwarded-proto” header 将被使用。当设定为 false 时,所有headers将被忽略。当该属性没有被设定时,将使用Express的trust proxy。
9. saveUninitialized - 强制将未初始化的session存储。当新建了一个session且未设定属性或值时,它就处于未初始化状态。在设定一个cookie前,这对于登陆验证,减轻服务端存储压力,权限控制是有帮助的。(默认: true )
10. unset - 控制req.session是否取消(例如通过 delete,或者将它的值设置为 null )。这可以使session保持存储状态但忽略修改或删除的请求(默认:keep)
|
三、session的常用方法
1
2
3
4
5
6
7
8
9
10
11
12
|
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信息,再回到首页显示为登陆。