网页防止用户重复登录
项目描述:以node.js + vue-cli + express 为基础的网页游戏的登录界面。
功能要求:用户在登录成功后将会跳转路由到主页面。不允许用户通过不同浏览器重复登录,同时也不允许用户在同一浏览器同时打开主界面。
同时考虑到性能,在这里只有用户发送http请求时才去判断是不是被重复登录,如果一直不发送,那么允许两个页面同时存在。
问题解决:
- 1.不允许用户通过不同浏览器登录
这里主要借助了seesion。用户登录时将sessionID存储在数据库中,每次发送HTTP请求时就去和数据库中存储的字段进行比较,不相同则认为已被其他处登录顶替。返回登录界面。
router.post('/queryUser', (req, res) => {
var sql = $sql.user.query;
var params = req.body;
conn.query(sql, [params.username], function(err, result) {
if (err) {
console.log(err);
}
if (result&&result[0]) {
if (result[0].password === params.password) {
jsonWrite(res, '登录成功');
req.session.username = params.username; //存储SESSION
req.session.name = result[0].name;
req.session.save();
login(req.session.username, req.sessionID, req);
}
else{
jsonWrite(res, '登录失败,请检查');
}
//jsonWrite(res, result);
}
else {
jsonWrite(res, '用户不存在');
}
})
});
验证session
//用户权限验证
router.post('/auverify', (req, res) => {
var sql = $sql.user.auverify;
var params = req.body;
if(params.limitlogin != req.session.limitlogin){
jsonWrite(res, '0');
return;
}
conn.query(sql, [req.session.username], function(err, result) {
if (err) {
console.log(err);
jsonWrite(res, '0');
req.session.destroy();
}
if (result&&result[0]) {
if(result[0].sessionid == req.sessionID)
jsonWrite(res, '1');
else{
jsonWrite(res, '0');req.session.destroy();
}
}
else{
jsonWrite(res, '0');
req.session.destroy();
}
})
});
- 2.不允许用户在同一浏览器同时打开主界面
因为同一浏览器的session是一样的,所以就可能出现这种情况。
那么此时对每一个主界面就需要一个唯一的标识符,并且他的作用范围还只能是针对当前SESSION。
如果超出了SESSION范围那么全局就只能登录一样账号了。这是肯定不符合业务逻辑的。
这里借助使用了随机字符,每次进入主界面就生成这个界面的唯一随机字符。
并将其存储在session中,这样当再次打开主界面时session中的随机字符就会被替换成最新打开界面的随机字符。
每次发送HTTP请求时,先进行权限验证,如果不通过,就不开放给其操作权限。
//用户权限验证 router.post('/auverify', (req, res) => { var sql = $sql.user.auverify; var params = req.body; if(params.limitlogin != req.session.limitlogin){ jsonWrite(res, '0'); return; } conn.query(sql, [req.session.username], function(err, result) { if (err) { console.log(err); jsonWrite(res, '0'); req.session.destroy(); } if (result&&result[0]) { if(result[0].sessionid == req.sessionID) jsonWrite(res, '1'); else{ jsonWrite(res, '0');req.session.destroy(); } } else{ jsonWrite(res, '0'); req.session.destroy(); } }) });
浙公网安备 33010602011771号