前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nodejs的session管理

nodejs的session管理

作者头像
OECOM
发布2020-07-01 17:29:28
1.6K0
发布2020-07-01 17:29:28
举报
文章被收录于专栏:OECOMOECOM

在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('/');
    });
});
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装相关依赖
  • session相关配置
  • 登录、登出接口实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档