Express+Nodejs 下的登陆拦截实现

Express+Nodejs 下的登陆拦截实现前端

  利用商城举例,在商城中没有登陆以前,能够看商品列表、详情、登陆或者注册均可以,可是购买的时候是不行的,那么这个功能在Node后台中是怎么实现的呢,这个功能能够由前端去在前台实现,可是不安全,本文今天讲解,Node 的全局拦截的实现。node

  在node项目中,打开 app.js ,咱们能够看到数据库

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

咱们能够看到,监听了全局的 404 错误,那么咱们能够借鉴这个方法去全局监听 登陆这个功能,实现全局的拦截。express

在全部的路由前边,添加全局拦截json

// 设置全局拦截
app.use((req, res, next) => {
    if(req.cookies.userId){
        // userId 存在,也就是登陆了,那就不拦截继续执行
        next();
    }else{
        /**
        * userId 不存在,也就是没有登陆了
        * 这个时候 让不登陆的接口 能继续调用,其余的一切接口所有禁用,这样就实现了,没有登陆什么都调用不了
        * req.originalUrl 当前接口地址
        * goods 做介绍,查询商品的时候,后边会与不少的参数,第几页多少数据排序等等这个时候,req.originalUrl 就不行了,这个获取不到后边的参数
        * 有两种方法
        * 一、req.originalUrl.indexOf('/goods') > -1
        * 二、获取不带参数的 url 地址 req.path 
        */ 
        // if(req.originalUrl == '/users/login' || req.originalUrl == '/users/loginOut' || req.originalUrl.indexOf('/goods/list') > -1 ){
        if(req.originalUrl == '/users/login' || req.originalUrl == '/users/loginOut' || req.path == '/goods/list' ){
            next();
        }else{
            res.json({
                status: '101',
                msg: "当前未登陆",
                result:''
            });
        }
    }
});

在这里使用的都是后台的 cookie 存储,能够使用后台的 session 。安全

Node 的登陆接口代码cookie

 

/**
* login
* 以及路由是 users 这里路径就不写 users 了
*/
router.post('/login', function(req, res, next) {
    var param = {
        userName: req.body.userName,
        userPwd: req.body.userPwd
    };
    // 经过 mongoose 查找修改数据库
    User.findOne(param, (err, doc) => {
        if(err){
            res.json({
                status: "1",
                msg: err.message
            });
        }else{
            // 接口调用成功
            if(doc){
                // 保存到 cookie
                res.cookie("userId", doc.userId, {
                    path: '/',
                    maxAge: 1000*60*60
                });
                res.cookie("userName", doc.userName, {
                    path: '/',
                    maxAge: 1000*60*60
                });
                // 保存 session,先要安装 express-session插件
                // req.session.user = doc;
                res.json({
                    status: "0",
                    msg: "",
                    result: {
                        userName: doc.userName
                    }
                });
            }
        }
    });
});
相关文章
相关标签/搜索