用户登录状态的检验。
用户的登录状态其实是个比较繁琐的过程。按照业务的要求,当用户点击登录界面的保存密码按钮时,在本地的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失效);
延伸:
既然可以在每次请求的时候进行用户登录状态的验证,也就可以在每次用户向后台请求的时候,进行权限的验证。
如果权限比较复杂,还可以自行设置黑白名单。