express指定返回的拦截器处理

文章参考

问题描述

在工作中需要使用token来验证用户登录是否有效,登录成功了才能访问特定的API,但是登录、注册的接口是不需要验证的,因此就需要针对某些特定的API做一个token验证,类似于java里面的AOP

解决办法

在指定范围URL前面添加了express(function(){})的函数,来处理token的验证

案例

const express = require("express");
const http = require("http");
const app = express();
////////////////////// 添加Log4js配置 /////////////////////////////
log.use(app);

////////////////////// 获取post过来的数据 /////////////////////////////
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: false }));

////////////////////// 设置web工程的根目录 /////////////////////////////
app.use(express.static(__dirname + '/'));

////////////////////// 允许跨域 /////////////////////////////
app.all('*', function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
    res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
    res.header("X-Powered-By",' 3.2.1')
    if(req.method=="OPTIONS") res.send(200);/*让options请求快速返回*/
    else  next();
});

////////////////////// 利用文件来拆分路由的规模 /////////////////////////////
var apiRouterIndex =  require('./routes/api/apiRouterIndex');
app.use('/api', apiRouterIndex);

////////////////////// 404处理 /////////////////////////////
app.get('*', function (req, res){
    console.log('404 handler..')
    res.render('common_page/404.html', {
        status: 404,
        title: 'NodeBlog',
    });
});

const server = http.createServer(app).listen(3000,'localhost',function () {
    const host = server.address().address;
    const port = server.address().port;
    // console.log("应用实例,访问地址为 http://%s:%s", host, port);
    process.env.host = host;
    // process 不能存储JSON格式的数据
    process.env.port = port;
    global.userInfo = {
        name: 'huangbiao',
        age: 30
    }
    app.SERVER_INFO = {
        name: 'zhangsan',
        age: 30
    }
});

需要使用app.use('/api', apiRouterIndex);这种方式配置URL请求的范围

const express = require('express');
const router = express.Router();
const tokenConfig = require('../common/config/tokenConfig');
// 处理token 的同一工具
const jwtUtils = require('../common/util/jwtUtils');
const apiService = require('./service/apiService.js');
var jwt= require('jsonwebtoken'); // 使用jwt签名
var fs = require('fs');

// 用来验证token,作为后台管理的拦截器
router.use(function (req, response, next) {
    var isToken = jwtUtils.checkTokenByRequest(req);
    // 如果获取的token 不合格,则给出提示信息
    if (!isToken) {
        response.status(200).json({
            state: 0,
            message: 'token数据不正确'
        });
        return false;
    }
    next();
});
// 查询所有的标签 接口
router.get('/tags/list', function(req, res, next) {
    // 创建tag标签
    apiService.queryTagList({},function (err, results, fields) {
        res.json({
            data: results
        });
    });
});

// 删除标签 接口
router.post('/tags/delete', function(req, res, next) {
    console.log(req.body);
    var id = req.body.id;
    // 删除tag标签
    apiService.deleteTagById(id, function (err, result) {
        res.json({
            status: true
        });
    });
});
module.exports = router;

在所有URL前面添加一个router.use(function (req, response, next) {next();});方法,用来验证token是否正确,这个拦截器只是针对http://localhost:3000/api打头的请求

// 引入模块依赖
const fs = require('fs');
const path = require('path');
const jwt = require('jsonwebtoken');
// 创建 token 类
class Jwt {
    constructor(data) {
        this.data = data;
    }
    // 检查token
    static checkTokenByRequest (requestObj) {
        // 拿取token 数据 按照自己传递方式写
        var tokenOrigin = requestObj.headers['Authorization'] || requestObj.headers['authorization'];
        if (tokenOrigin === '' || tokenOrigin === undefined || tokenOrigin === null ) {
            console.log('的值不能为空')
            return false;
        }
        // 获取服务器返回的token值
        var tokenStr = tokenOrigin.split(' ')[1];
        if (tokenStr === '' || tokenStr === undefined || tokenStr === null ) {
            console.log('token 格式不正确')
            return false;
        }
        return tokenStr;
    }
    // 从header请求中获取token 
    static getTokenFromHeader (requestObj) {
        var tokenStr = this.checkTokenByRequest(requestObj);
        if (tokenStr) {
            return tokenStr;
        } else {
            return null;
        }
    }
}

module.exports = Jwt;

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试