欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

nodejs實(shí)現(xiàn)黑名單中間件設(shè)計(jì)

 更新時(shí)間:2014年06月17日 11:39:58   投稿:hebedich  
最近寫(xiě)的項(xiàng)目中涉及到防止灌水的功能,于是設(shè)計(jì)了黑名單中間件,跟大家分享一下,同時(shí)也希望大家有好的建議能夠拍磚.

黑名單Schema:

復(fù)制代碼 代碼如下:

/**
 * 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} 創(chuàng)建時(shí)間
 * @param expireTime {Date} 如果是短暫屏蔽,屏蔽到期時(shí)間
 * @param forbiddenDegree {Number} 屏蔽級(jí)別 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: '請(qǐng)求次數(shù)頻繁'
    }
});

mongoose.model('BlackList', BlackList);

IP與提交記錄Schema:

復(fù)制代碼 代碼如下:

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

'use strict';

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

/**
 * 記錄參與調(diào)查問(wèn)卷的回復(fù)與Ip
 * @type {Schema}
 *
 * @param answerId {ObjectId} 回復(fù)Id
 * @param createAt {Date} 創(chuàng)建時(shí)間
 * @param ip {String} 參與回復(fù)的人Ip
 */
var IpAnswerLog = new Schema({
    answerId: {
        type: ObjectId
    },
    createAt: {
        type: Date,
        default:Date.now
    },
    ip:{
        type: String,
        index:true
    }
});

mongoose.model('IpAnswerLog', IpAnswerLog);

相關(guān)Proxy代碼:

復(fù)制代碼 代碼如下:

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

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

/**
 * 一小時(shí)內(nèi)回復(fù)數(shù)字
 * @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);
}

/**
 * 一天內(nèi)回復(fù)
 * @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);
}

/**
 * 計(jì)算某段時(shí)間內(nèi)回復(fù)數(shù)
 * @param beginTime {Number} 開(kāi)始時(shí)間 時(shí)間戳
 * @param endTime   {Number} 結(jié)束時(shí)間 如果為null,使用當(dāng)前時(shí)間 時(shí)間戳
 * @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:

復(fù)制代碼 代碼如下:

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

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

/**
 * 禁用Ip訪問(wèn)一小時(shí)
 * @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);
}

/**
 * 新建臨時(shí)黑名單
 * @param ip {String}
 * @param expireTime {Number} 到期時(shí)間
 * @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);
        }
    })
}

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

/**
 * 根據(jù)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;

中間件詳情:

復(fù)制代碼 代碼如下:

/**
 * 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移動(dòng)至黑名單中
 * @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('提交過(guò)于頻繁,1小時(shí)后重試!');
                    }
                });
            }else if(hourCount > 100){
                BlackListProxy.newAndSaveOneDayTempForbidden(ip, function(err, blackList){
                    if(err){
                        return next(err);
                    }else{
                        return res.send('提交過(guò)于頻繁,1天后重試!');
                    }
                })
            }else if(dayCount > 1000){
                BlackListProxy.newAndSaveOneDayTempForbidden(ip, function(err, blackList){
                    if(err){
                        return next(err);
                    }else{
                        return res.send('提交過(guò)于頻繁,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禁止提交,如有疑問(wèn)請(qǐng)聯(lián)系lihui.wang@tulingdao.com');
        }else{
            next();
        }
    })
}

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

在路由中使用:

復(fù)制代碼 代碼如下:

//網(wǎng)頁(yè)提交接口
router.post('/create', middleware.isNeedMoveToBlackList, paperAnswers.create);

相關(guān)文章

  • Node使用koa2實(shí)現(xiàn)一個(gè)簡(jiǎn)單JWT鑒權(quán)的方法

    Node使用koa2實(shí)現(xiàn)一個(gè)簡(jiǎn)單JWT鑒權(quán)的方法

    這篇文章主要介紹了Node使用koa2實(shí)現(xiàn)一個(gè)簡(jiǎn)單JWT鑒權(quán)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Node.js開(kāi)發(fā) path路徑模塊詳解

    Node.js開(kāi)發(fā) path路徑模塊詳解

    path 模塊是 Node.js 官方提供的、用來(lái)處理路徑的模塊,它提供了一系列的方法和屬性,用來(lái)滿足用戶對(duì)路徑的處理需求,這篇文章主要介紹了Node.js開(kāi)發(fā) path路徑模塊,需要的朋友可以參考下
    2024-02-02
  • node打造微信個(gè)人號(hào)機(jī)器人的方法示例

    node打造微信個(gè)人號(hào)機(jī)器人的方法示例

    這篇文章主要介紹了node打造微信個(gè)人號(hào)機(jī)器人的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • NodeJS創(chuàng)建基礎(chǔ)應(yīng)用并應(yīng)用模板引擎

    NodeJS創(chuàng)建基礎(chǔ)應(yīng)用并應(yīng)用模板引擎

    這篇文章主要介紹了NodeJS創(chuàng)建基礎(chǔ)應(yīng)用并應(yīng)用模板引擎的相關(guān)資料,需要的朋友可以參考下
    2016-04-04
  • 使用forever管理nodejs應(yīng)用教程

    使用forever管理nodejs應(yīng)用教程

    這篇文章主要介紹了使用forever管理nodejs應(yīng)用教程,本文介紹了forever的安裝、常用命令等,最有用的莫過(guò)于文件改動(dòng)監(jiān)聽(tīng)并自動(dòng)重啟了,這可以增加開(kāi)nodejs應(yīng)用的效率,需要的朋友可以參考下
    2014-06-06
  • Nodejs實(shí)現(xiàn)微信分賬的示例代碼

    Nodejs實(shí)現(xiàn)微信分賬的示例代碼

    這篇文章主要介紹了Nodejs實(shí)現(xiàn)微信分賬的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Node.js的HTTP模塊、URL模塊與supervisor工具介紹

    Node.js的HTTP模塊、URL模塊與supervisor工具介紹

    這篇文章介紹了Node.js的HTTP模塊、URL模塊與supervisor工具,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • mac中利用NVM管理不同node版本的方法詳解

    mac中利用NVM管理不同node版本的方法詳解

    這篇文章主要給大家介紹了關(guān)于在mac中利用NVM管理不同node版本的相關(guān)資料,文中詳細(xì)介紹了nvm的安裝和卸載、nvm安裝node的方法,以及nvm如何管理node版本,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • 在Express處理錯(cuò)誤和未匹配路由的解決方法

    在Express處理錯(cuò)誤和未匹配路由的解決方法

    在使用 Express 開(kāi)發(fā) Web 應(yīng)用程序時(shí),有效地處理錯(cuò)誤和管理未匹配任何定義處理程序的路由至關(guān)重要,這確保了應(yīng)用程序的健壯性和更好的用戶體驗(yàn),本文給出了詳細(xì)的解決方法,需要的朋友可以參考下
    2024-01-01
  • Node.js中看JavaScript的引用

    Node.js中看JavaScript的引用

    這篇文章主要介紹了Node.js中看JavaScript的引用的相關(guān)資料,需要的朋友可以參考下
    2017-04-04

最新評(píng)論