zoukankan      html  css  js  c++  java
  • Express+Nodejs 下的登录拦截实现

    Express+Nodejs 下的登录拦截实现

      利用商城举例,在商城中没有登录之前,可以看商品列表、详情、登录或者注册都可以,但是购买的时候是不行的,那么这个功能在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 错误,那么我们可以借鉴这个方法去全局监听 登录这个功能,实现全局的拦截。

    在所有的路由前边,添加全局拦截

    // 设置全局拦截
    app.use((req, res, next) => {
        if(req.cookies.userId){
            // userId 存在,也就是登录了,那就不拦截继续执行
            next();
        }else{
            /**
            * userId 不存在,也就是没有登录了
            * 这个时候 让不登录的接口 能继续调用,其他的一切接口全部禁用,这样就实现了,没有登录什么都调用不了
            * req.originalUrl 当前接口地址
            * goods 作介绍,查询商品的时候,后边会与很多的参数,第几页多少数据排序等等这个时候,req.originalUrl 就不行了,这个获取不到后边的参数
            * 有两种方法
            * 1、req.originalUrl.indexOf('/goods') > -1
            * 2、获取不带参数的 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 的登录接口代码

    /**
    * 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
                        }
                    });
                }
            }
        });
    });
    

      

  • 相关阅读:
    Mysql数据库相关流程图/原理图
    【nginx】配置Nginx实现负载均衡
    数据库设计——评论回复功能
    html生成pdf
    cmd下载echarts包
    windows安装cnpm步骤
    你不在,是一年一年,你在,是春夏秋冬
    聚合
    Beyond compare4密钥
    ExtJs目录说明
  • 原文地址:https://www.cnblogs.com/haonanZhang/p/8311579.html
Copyright © 2011-2022 走看看