nodejs的session管理

2020-07-01 17:29:28 浏览数 (1)

在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

本文基于express、express-session实现了简易的session管理。

安装相关依赖

代码语言:javascript复制
npm install --save express-session session-file-store

session相关配置

具体的配置如下

代码语言:javascript复制
var express = require('express');
var app = express();
var session = require('express-session');
var FileStore = require('session-file-store')(session);

var identityKey = 'skey';

app.use(session({
    name: identityKey,//存储在用户cookie中的key名
    secret: 'oecom',  // 用来对session id相关的cookie进行签名
    store: new FileStore(),  // 本地存储session(文本文件,也可以选择其他store,比如redis的)
    saveUninitialized: false,  // 是否自动保存未初始化的会话,建议false
    resave: false,  // 是否每次都重新保存会话,建议false
    cookie: {
        maxAge: 10 * 1000  // 有效期,单位是毫秒
    }
}));

登录、登出接口实现

登录成功之后将session信息存入,在需要判断的地方进行判断即可。

代码语言:javascript复制
router.get('/login',function (req,res){
	//console.log(req);
	try{
		var params = url.parse(req.url, true).query;
		var userName = params.userName;
		var password = params.password;
		var response = {
			success:false,
			errormsg:"查询失败"
		}
		var pattern = /["'=] /;
		if(pattern.test(userName)){
			response.errormsg = "非法攻击";
			res.end(JSON.stringify(response));
		}
               
		var sql = 'select * from userInfo where name = "' userName '" and password="' password '"';
		console.log(sql);
		mysql.query(sql,function(err,result,fildes){

			if(err){
			     console.log("login:"   JSON.stringify(err));
			     res.end(JSON.stringify(response));
                            //callback(false, JSON.stringify(err));
			}else{
				console.log(result);
				 if (result.length == 0) {
				 	response.errormsg = "无此人信息";
				 	 res.end(JSON.stringify(response));
				 }else{
				 	response.success = true;
				 	response.errormsg = "查询成功";
				 	var sess = req.session;
					sess.regenerate(function(err){ //添加session信息
					    req.session.loginUser =  params.userName;
					     res.end(JSON.stringify(response));
						
					})
				 	
				 }
			}
		})
		console.log(userName)
		
		
		
	}catch(e){
		 try {
            callback(false, JSON.stringify(e));
        } catch (e) {}
	}
	
});

首页页面判断是否已经登录过

代码语言:javascript复制
pp.get('/', function(req,res){
 
var logined='';
if(!!req.session.loginUser){
logined = "已经登录"
}else{
  logined = "没有登录"
}
console.log(logined);
	res.render('index',{title:'文章列表',logined:logined})
})

登出时只要将session销毁掉即可

代码语言:javascript复制
app.get('/logout', function(req, res, next){
    // 备注:这里用的 session-file-store 在destroy 方法里,并没有销毁cookie
    // 所以客户端的 cookie 还是存在,导致的问题 --> 退出登陆后,服务端检测到cookie
    // 然后去查找对应的 session 文件,报错
    // session-file-store 本身的bug    

    req.session.destroy(function(err) {
        if(err){
            res.end({ret_code: 2, ret_msg: '退出登录失败'});
            return;
        }
        
        // req.session.loginUser = null;
        res.clearCookie(identityKey);
        res.redirect('/');
    });
});

0 人点赞