亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

nodejs實現黑名單中間件設計

2019-11-20 14:27:23
字體:
來源:轉載
供稿:網友

黑名單Schema:

復制代碼 代碼如下:

/**
 * Created by YCXJ-wanglihui on 2014/5/28.
 */
'use strict';

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

//1.短暫屏蔽 2.永久屏蔽
var degree = {TEMP:1, FOREVER:2};

/**
 * 黑名單
 * @type {Schema}
 *
 * @param ip {String} 黑名單Ip
 * @param createAt {Date} 創建時間
 * @param expireTime {Date} 如果是短暫屏蔽,屏蔽到期時間
 * @param forbiddenDegree {Number} 屏蔽級別 1.短暫屏蔽 2.永久屏蔽
 * @param reason {String} 屏蔽原因
 */
var BlackList = new Schema({
    ip:{
        type: String,
        index:true
    },
    createAt:{
        type: Date,
        default: Date.now
    },
    expireTime:{
        type: Date
    },
    forbiddenDegree:{
        type: Number,
        default:degree.TEMP
    },
    reason:{
        type: String,
        default: '請求次數頻繁'
    }
});

mongoose.model('BlackList', BlackList);

IP與提交記錄Schema:

復制代碼 代碼如下:

/**
 * Created by YCXJ-wanglihui on 2014/5/28.
 */

'use strict';

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;

/**
 * 記錄參與調查問卷的回復與Ip
 * @type {Schema}
 *
 * @param answerId {ObjectId} 回復Id
 * @param createAt {Date} 創建時間
 * @param ip {String} 參與回復的人Ip
 */
var IpAnswerLog = new Schema({
    answerId: {
        type: ObjectId
    },
    createAt: {
        type: Date,
        default:Date.now
    },
    ip:{
        type: String,
        index:true
    }
});

mongoose.model('IpAnswerLog', IpAnswerLog);

相關Proxy代碼:

復制代碼 代碼如下:

/**
 * Created by YCXJ-wanglihui on 2014/5/28.
 */
'use strict';

var IpAnswerLog = require('../models').IpAnswerLog;

/**
 * 新建并保存
 * @param ipAnswerLog {Schema or dict}
 * @param callback
 */
var newAndSave = function(ipAnswerLog, callback){
    if(ipAnswerLog instanceof IpAnswerLog){
        ipAnswerLog.save(callback);
    }else{
        var m = new IpAnswerLog(ipAnswerLog);
        m.save(callback);
    }
}

/**
 * 一分鐘內回復數
 * @param ip
 * @param callback
 */
var countOneMinuteAnswer = function(ip, callback){
    var endTime = Date.now();
    var beginTime = endTime - 1000*60*1;
    countIpAnswerByTime(beginTime, endTime, ip, callback);
}

/**
 * 一小時內回復數字
 * @param ip
 * @param callback
 */
var countOneHourAnswer = function(ip, callback){
    var endTime = Date.now();
    var beginTime = endTime - 1000*60*60*1;
    countIpAnswerByTime(beginTime, endTime, ip, callback);
}

/**
 * 一天內回復
 * @param ip
 * @param callback
 */
var countOneDayAnswer = function(ip, callback){
    var endTime = Date.now();
    var beginTime = endTime - 1000*60*60*24;
    countIpAnswerByTime(beginTime, endTime, ip, callback);
}

/**
 * 計算某段時間內回復數
 * @param beginTime {Number} 開始時間 時間戳
 * @param endTime   {Number} 結束時間 如果為null,使用當前時間 時間戳
 * @param ip    {String} Ip地址
 * @param callback
 */
var countIpAnswerByTime = function(beginTime, endTime, ip, callback){
    if(!endTime){
        endTime = Date.now();
    }
    IpAnswerLog.count({ip:ip, '$and':{$lt:beginTime, $gt:endTime}}, callback);
}

exports.countIpAnswerByTime =countIpAnswerByTime;
exports.countOneDayAnswer = countOneDayAnswer;
exports.countOneHourAnswer = countOneHourAnswer;
exports.countOneMinuteAnswer = countOneMinuteAnswer;
exports.newAndSave = newAndSave;

黑名單Proxy:

復制代碼 代碼如下:

/**
 * Created by YCXJ-wanglihui on 2014/5/28.
 */
'use strict';
var BlackList = require('../models').BlackList;

/**
 * 新建并保存
 * @param backList {BlackList} or {dict} 黑名單數據
 * @param callback
 */
var newAndSave = function(backList, callback){
    if(backList instanceof BlackList){
        backList.save(callback);
    }else{
        var m = new BlackList(backList);
        m.save(callback);
    }
}

/**
 * 禁用Ip訪問一小時
 * @param ip {String}
 * @param callback
 */
var newAndSaveOneHourTempForbidden = function(ip, callback){
    var expireTime = Date.now() + 1000*60*60;
    newAndSaveTempForbidden(ip,expireTime, callback);
}

/**
 * 禁用一天
 * @param ip {String}
 * @param callback
 */
var newAndSaveOneDayTempForbidden = function(ip, callback){
    var expireTime = Date.now() + 1000*60*60*24;
    newAndSaveTempForbidden(ip, expireTime, callback);
}

/**
 * 新建臨時黑名單
 * @param ip {String}
 * @param expireTime {Number} 到期時間
 * @param callback
 */
var newAndSaveTempForbidden = function(ip, expireTime,callback){
    var blackList = new BlackList({ip:ip, expireTime:expireTime, forbiddenDegree:1});
    newAndSave(blackList, callback);
}

/**
 * 新建并保存永久黑名單
 * @param ip
 * @param callback
 */
var newAndSaveForeverForbidden = function(ip, callback){
    var blackList = new BlackList({ip:ip, forbiddenDegree:2});
    newAndSave(blackList, callback);
}

/**
 * 判斷是否在黑名單中
 * @param ip {String} Ip地址
 * @param callback
 */
var isInBlackList = function(ip, callback){
    getBlackListByIp(ip, function(err, blackList){
        if(err){
            callback(err);
        }else if(blackList){
            var currentDate = Date.now();
            if(blackList.forbiddenDegree ===1 && blackList.expireTime> currentDate){
                removeBlackListByIp(ip, function(err){
                    if(err){
                        callback(err);
                    }else{
                        callback(null, false);
                    }
                })
            }else{
                callback(null, true);
            }
        }else{
            callback(null, false);
        }
    })
}

/**
 * 通過Ip獲取黑名單條目
 * @param ip
 * @param callback
 */
var getBlackListByIp = function(ip, callback){
    BlackList.findOne({ip:ip}, callback);
}

/**
 * 根據Ip刪除黑名單
 * @param ip
 * @param callback
 */
var removeBlackListByIp = function(ip, callback){
    getBlackListByIp(ip, function(err, blackList){
        if(err){
            callback(err);
        }else if(blackList){
            blackList.remove(callback);
        }else{
            callback(null,null);
        }
    })
}

exports.newAndSave = newAndSave;
exports.isInBlackList = isInBlackList;
exports.getBlackListByIp = getBlackListByIp;
exports.removeBlackListByIp = removeBlackListByIp;
exports.newAndSaveOneHourTempForbidden = newAndSaveOneHourTempForbidden;
exports.newAndSaveOneDayTempForbidden = newAndSaveOneDayTempForbidden;
exports.newAndSaveForeverForbidden = newAndSaveForeverForbidden;
exports.newAndSaveTempForbidden = newAndSaveTempForbidden;

中間件詳情:

復制代碼 代碼如下:

/**
 * Created by YCXJ-wanglihui on 2014/5/28.
 */
'use strict';

var BlackListProxy = require('../../proxy').BlackListPorxy;
var IpAnswerLogProxy = require('../../proxy').IpAnswerLogProxy;
var EventProxy = require('eventproxy');

/**
 * 判斷是否需要將Ip移動至黑名單中
 * @param req
 * @param res
 * @param next
 */
var isNeedMoveToBlackList = function(req, res, next){
    var ip = req.ip;
    //判斷是否在黑名單中
    requireNotInBlackList(req, res, function(){
        var ep = new EventProxy();
        ep.fail(next);

        ep.all('minuteCount', 'hourCount', 'dayCount', function(minuteCount, hourCount, dayCount){
            if(minuteCount > 10){
                BlackListProxy.newAndSaveOneHourTempForbidden(ip, function(err, blackList){
                    if(err){
                        return next(err);
                    }else{
                        return res.send('提交過于頻繁,1小時后重試!');
                    }
                });
            }else if(hourCount > 100){
                BlackListProxy.newAndSaveOneDayTempForbidden(ip, function(err, blackList){
                    if(err){
                        return next(err);
                    }else{
                        return res.send('提交過于頻繁,1天后重試!');
                    }
                })
            }else if(dayCount > 1000){
                BlackListProxy.newAndSaveOneDayTempForbidden(ip, function(err, blackList){
                    if(err){
                        return next(err);
                    }else{
                        return res.send('提交過于頻繁,1天后重試!');
                    }
                })
            }else{
                return next();
            }
        })

        IpAnswerLogProxy.countOneMinuteAnswer(ip,ep.done('minuteCount'));
        IpAnswerLogProxy.countOneHourAnswer(ip, ep.done('hourCount'));
        IpAnswerLogProxy.countOneDayAnswer(ip, ep.done('dayCount'));
    });
}

/**
 * 中間件 要求Ip不在黑名單中
 * @param req
 * @param res
 * @param next
 */
var requireNotInBlackList = function(req, res, next){
    var ip = req.ip;
    BlackListProxy.isInBlackList(ip, function(err, result){
        if(err){
            next(err);
        }else if(result){
            return res.send('您的Ip禁止提交,如有疑問請聯系lihui.wang@tulingdao.com');
        }else{
            next();
        }
    })
}

exports.isNeedMoveToBlackList = isNeedMoveToBlackList;
exports.requireNotInBlackList = requireNotInBlackList;

在路由中使用:

復制代碼 代碼如下:

//網頁提交接口
router.post('/create', middleware.isNeedMoveToBlackList, paperAnswers.create);

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩激情片免费| 538国产精品视频一区二区| 日韩av一区二区在线| 国产剧情日韩欧美| 亚洲毛茸茸少妇高潮呻吟| 久久综合色88| 亚洲免费成人av电影| 亚洲成人中文字幕| 亚洲va欧美va国产综合剧情| 欧美自拍大量在线观看| 欧美成人激情视频免费观看| 亚洲精品视频网上网址在线观看| 九九精品视频在线| 亚洲丁香久久久| 欧美日韩国产一中文字不卡| 亚洲网站视频福利| 欧美激情国产高清| 丝袜美腿精品国产二区| 国产精品成人av性教育| 国产精品入口尤物| 亚洲系列中文字幕| 亚洲欧美中文字幕在线一区| 日韩精品高清在线| 夜夜嗨av一区二区三区四区| 欧美激情videos| 亚洲天堂av在线播放| 欧美日韩亚洲一区二区| 日韩动漫免费观看电视剧高清| 精品亚洲一区二区三区在线播放| 久久深夜福利免费观看| 欧美日韩在线另类| 亚洲一级免费视频| 久久好看免费视频| 亚洲精品有码在线| 亚洲成人网在线| 国产精品私拍pans大尺度在线| 欧洲成人性视频| 久久久久久美女| 深夜福利91大全| 8050国产精品久久久久久| 亚洲免费视频一区二区| 91wwwcom在线观看| 欧美亚洲日本黄色| 欧美专区在线视频| 日韩欧美精品免费在线| 欧美成人激情视频免费观看| 色综合色综合久久综合频道88| 欧美精品九九久久| 国产精品av在线| 青青久久av北条麻妃海外网| 日韩av在线一区二区| 亚洲精品一区在线观看香蕉| 日韩动漫免费观看电视剧高清| 91精品综合视频| 色综合色综合网色综合| 欧美精品www在线观看| 国产一区二区三区在线看| 国产成人激情小视频| 国产91免费观看| 91色琪琪电影亚洲精品久久| 日本精品一区二区三区在线| 国产精品∨欧美精品v日韩精品| 亚洲精品自在久久| 免费91麻豆精品国产自产在线观看| 九九久久精品一区| 亚洲a在线观看| 美日韩精品视频免费看| 亚洲综合色av| 亚洲第一精品夜夜躁人人躁| 久久久久久尹人网香蕉| 国产亚洲aⅴaaaaaa毛片| 精品国产一区二区三区四区在线观看| 亚洲视频专区在线| 亚洲理论在线a中文字幕| 91网站免费观看| 日本精品视频在线| 91在线免费观看网站| 5566成人精品视频免费| 亚洲第一视频网站| 亚洲高清免费观看高清完整版| 久久九九亚洲综合| 欧美裸体男粗大视频在线观看| 色综合男人天堂| 久久精品国产亚洲一区二区| 最新日韩中文字幕| 色婷婷av一区二区三区在线观看| 国产午夜精品视频免费不卡69堂| 亚洲乱码国产乱码精品精| 国产精品一二三视频| 欧美极品少妇全裸体| 日韩视频免费中文字幕| 亚洲网站视频福利| 国产va免费精品高清在线| 黄色成人av在线| 欧美大片大片在线播放| 日日骚av一区| 欧美视频在线观看 亚洲欧| 一区二区三区美女xx视频| 欧美日韩午夜视频在线观看| 欧美性受xxxx白人性爽| 97人洗澡人人免费公开视频碰碰碰| 亚洲香蕉成人av网站在线观看| 亚洲乱码国产乱码精品精| 亚洲福利视频网| 日韩在线观看你懂的| 日韩国产中文字幕| 欧美日韩在线视频一区二区| 精品久久久香蕉免费精品视频| 国产精品视频一区二区三区四| 亚洲电影中文字幕| 亚洲国产小视频在线观看| 在线观看欧美www| 国产精品久久久久久久app| 欧美激情第99页| www.亚洲天堂| 日韩精品欧美国产精品忘忧草| 91豆花精品一区| 日韩av免费看网站| 国内久久久精品| 疯狂做受xxxx高潮欧美日本| 欧美激情视频三区| 中文字幕亚洲欧美日韩在线不卡| 亚洲女人天堂色在线7777| 国内精品久久久久久| www.日韩av.com| 亚洲影院高清在线| 精品女同一区二区三区在线播放| 91精品国产91久久久久福利| 久久久久久亚洲精品中文字幕| 国产精品精品视频一区二区三区| 久久精品国产2020观看福利| 国产精品免费一区| 亚洲理论片在线观看| 日韩中文字幕久久| 中文精品99久久国产香蕉| 亚洲高清色综合| 亚洲999一在线观看www| 美女精品久久久| 亚洲精品动漫久久久久| 久久香蕉国产线看观看av| 欧美日韩福利视频| 欧美性少妇18aaaa视频| 亚洲免费一级电影| 久久久综合免费视频| 国内精品模特av私拍在线观看| 日韩av手机在线观看| 国产欧美日韩丝袜精品一区| 欧美性xxxx| 欧美精品免费看| 97在线免费观看视频| 裸体女人亚洲精品一区| 欧美精品18videos性欧| 亚洲乱码国产乱码精品精| 精品欧美aⅴ在线网站| 中国日韩欧美久久久久久久久| 久久五月天色综合| 亚洲国产高清高潮精品美女| 91精品国产高清自在线| 久久99久久久久久久噜噜| 成人激情视频免费在线| 黄色一区二区在线| 久久国产精品首页| 欧美亚洲国产另类| 亚洲成人黄色在线观看|