zoukankan      html  css  js  c++  java
  • node express 登录拦截器 request接口请求

    1.拦截器

    拦截器可以根据需要 做权限拦截 登录只是权限的一种,

    思路是req.session.user判断用户session是否存在,是否是需要拦截的地址,

    如果是就跳转登录页,或其他页,

    如果非需拦截页,则执行 next(); 放行

    因为是顺序执行的所以 app.all('/*', function(req, res, next){   这个方法需放在定义的路由之上

    具体写法如下:

    //登录拦截器
    app.all('/*', function(req, res, next){
      if (req.session.user) {
        next();
      }else {
        var arr = req.url.split('/');// 解析用户请求的路径
    
        for (var i = 0, length = arr.length; i < length; i++) {// 去除 GET 请求路径上携带的参数
          arr[i] = arr[i].split('?')[0];
        }
        if (arr.length > 1 && arr[1] == '') {// 判断请求路径是否为根、登录、注册、登出,如果是不做拦截
          next();
        } else if (arr.length > 2 && arr[1] == 'user' && (arr[2] == 'register' || arr[2] == 'login' || arr[2] == 'logout' || arr[2].indexOf('login') > 0 )) {
          next();
        } else {  // 登录拦截
          req.session.originalUrl = req.originalUrl ? req.originalUrl : null;  // 记录用户原始请求路径
          req.flash('error', '请先登录');
          res.redirect('/user/login');  // 将用户重定向到登录页面
        }
      }
    });

     结尾附上我的app.js:

    var express = require('express');
    var path = require('path');
    var favicon = require('serve-favicon');
    var logger = require('morgan');
    var cookieParser = require('cookie-parser');
    var session = require('express-session');
    var bodyParser = require('body-parser');
    var hbs = require('hbs');
    var flash = require('connect-flash');
    
    var index = require('./routes/index');
    var users = require('./routes/users');
    var about = require('./routes/about');
    var list_ = require('./routes/product/list');
    var login = require('./routes/user/login');
    var login_post = require('./routes/user/login_post');
    
    var app = express();
    
    app.use(cookieParser());
    app.use(session({
      secret: '123456',
      cookie: {maxAge: 60 * 1000 * 30},
      resave: false,
      saveUninitialized: true
    }));
    
    app.use(flash());
    
    hbs.registerPartials(path.join(__dirname, 'views', 'partials' ));
    // view engine setup
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'hbs');
    
    var blocks = {};
    
    hbs.registerHelper('extend', function(name, context) {
      var block = blocks[name];
      if (!block) {
        block = blocks[name] = [];
      }
    
      block.push(context.fn(this)); // for older versions of handlebars, use block.push(context(this));
    });
    
    hbs.registerHelper('block', function(name) {
      var val = (blocks[name] || []).join('
    ');
    
      // clear the block
      blocks[name] = [];
      return val;
    });
    
    // uncomment after placing your favicon in /public
    app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
    app.use(logger('dev'));
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(cookieParser());
    app.use(express.static(path.join(__dirname, 'public')));
    
    //登录拦截器
    app.all('/*', function(req, res, next){
      if (req.session.user) {
        next();
      }else {
        var arr = req.url.split('/');// 解析用户请求的路径
    
        for (var i = 0, length = arr.length; i < length; i++) {// 去除 GET 请求路径上携带的参数
          arr[i] = arr[i].split('?')[0];
        }
        if (arr.length > 1 && arr[1] == '') {// 判断请求路径是否为根、登录、注册、登出,如果是不做拦截
          next();
        } else if (arr.length > 2 && arr[1] == 'user' && (arr[2] == 'register' || arr[2] == 'login' || arr[2] == 'logout' || arr[2].indexOf('login') >= 0 )) {
          next();
        } else {  // 登录拦截
          req.session.originalUrl = req.originalUrl ? req.originalUrl : null;  // 记录用户原始请求路径
          req.flash('error', '请先登录');
          res.redirect('/user/login');  // 将用户重定向到登录页面
        }
      }
    });
    
    app.use('/', index);
    app.use('/users', users);
    app.use('/about', about);
    app.use('/product/list', list_);
    app.use('/user/login', login);
    app.use('/user/loginPost', login_post);
    
    // 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');
    });
    
    module.exports = app;

    2.request接口请求

    request模块安装:$npm install request --save-dev

    引入模块:var request = require('request');

    可以传入一个callback回调函数 执行 请求后数据

     var url = "https://xxxxxx/login";
      //var md5 = crypto.createHash('md5');//md5加密模块
      //pwd = md5.update(pwd).digest('hex');
    
      var formData = {
        user_name: userName,
        passwd: pwd,
        access_token: "1"
      };
      request.post({url:url, formData: formData}, function(err, httpResponse, body) {
        if (err) {
          console.error('failed:', err);
          callback && callback(err);
        }else{
          var data = eval('(' + body + ')');
          if (data.errorCode == 0) {
            var userInfo = data.data;
            callback && callback(userInfo);
          }
        }
      });
  • 相关阅读:
    PostgreSQL 9.6.2版本在centOS下的安装和配置
    postgreSQL 创建user表时引发的表名大写与双引号问题
    Go JSON嵌套解析失败
    面试杂谈:面试程序员时都应该考察些什么?<转>
    Golang bash脚本自动创建一个go工程
    iOS Debug心得 (持续更新)
    iOS 上传APP到AppStore 卡在 Authenticating with the iTunes store 提示
    iOS 应用打包 设备兼容性问题(Build Active Architecture Only)
    Go 使用自定义包(package)
    Go 连接PostgreSQL数据库
  • 原文地址:https://www.cnblogs.com/juexin/p/6943848.html
Copyright © 2011-2022 走看看