您的位置:首页 > 其它

如何解决每次向后台发起请求时判断用户是否处于登录状态?

2017-04-06 15:20 501 查看

事件起因:

小x向我反应用户在我开发的系统中,在其中一个功能上待了很长时间,当用户跳转到其他界面上时,突然就掉线了。

他告诉我应当在用户每次向后台索取数据的时候进行用户登录状态的检验

用户的登录状态其实是个比较繁琐的过程。按照业务的要求,当用户点击登录界面的保存密码按钮时,在本地的cookie进行长达七天的保存。当用户没有点击保存密码的时候,主要依靠session来进行保存。

session与cookie:

这两者之间的关系,网上有太多内容介绍了。简单来说:session放在服务器端。当浏览器关闭就会清空。session时间不宜设置过长,否则大量占用服务器内存。cookie适合长时间保存,在登出时被清除。

验证用户是否登录的逻辑:

1)用户密码登录时,在后台的req中记住session.

2)如果用户保存登录密码,则记住cookie,否则把当前用户的cookie设置为空;

3)每次用户需要向后台进行请求时,进行状态检验:

session是否存在?若存在,则继续进行请求操作,并将session的有效时间重新设置一次;

若不存在,则判断cookie是否存在?若存在,使用该cookie完成自动登录,即完成了一次1);

若不存在,则页面重定向到登录页面。

解决方案:

上面的验证逻辑有了。那么在什么地方进行验证呢?总不能在每次进行请求的地方都进行一遍这样的验证吧?无论是放在前端的调用,中间的路由,或者后台的操作上,显然都显得太过冗沉。

经过一番资料查询,我找到了方法:

对所有的后端请求进行拦截。

var app = express();
app.use(function (req, res, next) {
if (req.session.login_account) {  // 判断用户session是否存在
next();
} else {

var arr = req.url.split('/');
for (var i = 0, length = arr.length; i < length; i++) {
arr[i] = arr[i].split('?')[0];
}

// 判断请求路径是否为根、登录、注册、登出,如果是不做拦截
if (arr.length > 2 && arr[0] == ''&&arr[1] == 'operlogin' && arr[2] == 'checklogin' || arr[2] == 'login') {
next();
}
else {
// req.session.originalUrl = req.originalUrl ? req.originalUrl : null;  // 记录用户原始请求路径
res.redirect("index2.html#/operlogin");
}
}
});


因为开发的系统使用的是express来提供前后端的链接,因此可以直接在此处对请求进行拦截。

判断用户的session是否存在,如果存在,将session的超时时间重新设置(如果session的有效时间是二十分钟,每一次向后台的操作都将使时这个时间重新设置为二十分钟,直到二十分钟用户都没有操作,则session失效);

这里有个很巧妙的地方,
if (req.session.login_account)
每次进行判断之后,session会自动重新设置自己的有效时间。所以只需要每次请求进行一次判断就可以了。

如果session失效,或者没有session,则需要根据请求的url判断是否应该对这个请求放行。比如,如果是注册,登录,登出,默认的寻找cookie进行自动登录等请求,则可以直接放行。反之,则表示没有session,没有cookie,需要跳转到登录页面。

(如果session的有效时间是二十分钟,每一次向后台的操作都将使时这个时间重新设置为二十分钟,直到二十分钟用户都没有操作,则session失效);

延伸:

既然可以在每次请求的时候进行用户登录状态的验证,也就可以在每次用户向后台请求的时候,进行权限的验证。

如果权限比较复杂,还可以自行设置黑白名单。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: