用户登录状态的监听

用户登录状态的检验

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

        

session与cookie:

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


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


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

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

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

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

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

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


解决方案:

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

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

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

    

           var app = express();
  
  

  
  
  1. app.use( function (req, res, next) {
  2. if (req.session.login_account) { // 判断用户session是否存在
  3. next();
  4. } else {
  5. var arr = req.url.split( '/');
  6. for ( var i = 0, length = arr.length; i < length; i++) {
  7. arr[i] = arr[i].split( '?')[ 0];
  8. }
  9. // 判断请求路径是否为根、登录、注册、登出,如果是不做拦截
  10. if (arr.length > 2 && arr[ 0] == ''&&arr[ 1] == 'operlogin' && arr[ 2] == 'checklogin' || arr[ 2] == 'login') {
  11. next();
  12. }
  13. else {
  14. // req.session.originalUrl = req.originalUrl ? req.originalUrl : null; // 记录用户原始请求路径
  15. res.redirect( "index2.html#/operlogin");
  16. }
  17. }
  18. });


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

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

这里有个很巧妙的地方,

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

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

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

延伸:

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

如果权限比较复杂,还可以自行设置黑白名单。



本文转载自https://blog.csdn.net/xixi880928



       

                    

        </div>
            </div>
        </article>

猜你喜欢

转载自blog.csdn.net/qq_36235275/article/details/81139847
今日推荐