在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('/');
});
});