三鑫西瓜霜

 

网页防止用户重复登录

项目描述:以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();
        }
    })
});

 

posted on 2021-09-27 10:59  三鑫西瓜霜  阅读(794)  评论(0)    收藏  举报

导航