Heim Web-Frontend js-Tutorial nodejs implementiert die Blacklist-Middleware design_node.js

nodejs implementiert die Blacklist-Middleware design_node.js

May 16, 2016 pm 04:44 PM
nodejs 黑名单

Blacklist-Schema:

Code kopieren Der Code lautet wie folgt:

/**
 * Erstellt von YCXJ-wanglihui am 28.05.2014.
 */
'strikt verwenden';

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

//1. Vorübergehende Blockierung 2. Permanente Blockierung
var grade = {TEMP:1, FOREVER:2};

/**
* Blacklist
* @type {Schema}
*
* @param ip {String} Blacklist Ip
* @param createAt {Date} Erstellungszeit
* @param ExpireTime { Datum} Wenn es sich um eine vorübergehende Sperrung handelt, die Ablaufzeit der Sperrung
* @param prohibitionDegree {Number} Sperrstufe 1. Vorübergehende Sperrung 2. Permanente Sperrung
* @param reason {String} Sperrgrund
*/
var BlackList = new Schema({
ip:{
type: String,
index:true
},
createAt: {
Typ: Datum,
Standard: Date.now
},
Ablaufzeit:{
Typ: Datum
},
verbotener Grad:{
Typ: Zahl ,
default:degree.TEMP
},
reason:{
type: String,
default: 'Häufige Anfragen'
}
});

mongoose.model('BlackList', BlackList);

IP- und Übermittlungsdatensatzschema:

Code kopieren Der Code lautet wie folgt:

/**
 * Erstellt von YCXJ-wanglihui am 28.05.2014.
 */

'strikt verwenden';

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

/**
* Erfassen Sie die Antworten und die IP der teilnehmenden Fragebögen
* @type {Schema}
*
* @param answerId {ObjectId} Antwort-ID
* @param createAt {Date} Erstellungszeit
* @param ip {String} Die IP der Person, die an der Antwort teilnimmt
*/
var IpAnswerLog = new Schema({
answerId: {
type: ObjectId
},
createAt: {
type: Date ,
default:Date.now
},
ip:{
type: String,
index:true
}
});

mongoose.model('IpAnswerLog', IpAnswerLog);

Zugehöriger Proxy-Code:

Code kopieren Der Code lautet wie folgt:

/**
 * Erstellt von YCXJ-wanglihui am 28.05.2014.
 */
'use strict';

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

/**
* Neu erstellen und speichern
* @param ipAnswerLog {Schema oder dict}
* @param callback
*/
var newAndSave = function(ipAnswerLog, callback){
    if(ipAnswerLog instanceof IpAnswerLog){
        ipAnswerLog.save(callback);
    }else{
        var m = new IpAnswerLog(ipAnswerLog);
        m.save(callback);
    }
}

/**
* Anzahl der Antworten innerhalb einer Minute
* @param ip
* @param callback
*/
var countOneMinuteAnswer = function(ip, callback){
    var endTime = Date.now();
    var beginTime = endTime - 1000*60*1;
    countIpAnswerByTime(beginTime, endTime, ip, callback);
}

/**
* Antwortnummer innerhalb einer Stunde
* @param ip
* @param Rückruf
*/
var countOneHourAnswer = function(ip, callback){
    var endTime = Date.now();
    var beginTime = endTime - 1000*60*60* 1;
    countIpAnswerByTime(beginTime, endTime, ip, callback);
}

/**
* Antwort innerhalb eines Tages
* @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);
}

/**
* Berechnen Sie die Anzahl der Antworten innerhalb eines bestimmten Zeitraums
* @param beginTime {Number} Zeitstempel der Startzeit
* @param endTime {Number} Wenn die Endzeit null ist, verwenden Sie den aktuellen Zeitstempel
* @param ip {String} IP-Adresse
* @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);
}

/**
* Blacklist basierend auf IP löschen
* @param ip
* @param callback
*/
var removeBlackListByIp = function(ip, callback){
    getBlackListByIp(ip, function(err, blackList){
        if(err){
            Callback (err) })
}

exports.newAndSave = newAndSave;
exports.isInBlackList = isInBlackList;
exports.getBlackListByIp = getBlackListByIp;
exports.removeBlackListByIp = takeBlackListByIp;
exports.newAndSaveOneHourTempForbidden = OneHourTempForbidden;

Exporte. 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'));
    });
}

/**
* Middleware nécessite que l'IP ne soit pas dans la liste noire
* @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('Votre adresse IP ne peut pas être soumise. Si vous avez des questions, veuillez contacter lihui. wang@tulingdao.com');
      }else{
                   suivant();                                                           
exports.isNeedMoveToBlackList = isNeedMoveToBlackList;
exports.requireNotInBlackList = requireNotInBlackList;


Utilisation en routage :

Copier le code

Le code est le suivant ://Interface de soumission de page Web router.post( '/create', middleware.isNeedMoveToBlackList, paperAnswers.create);

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Der Unterschied zwischen NodeJS und Tomcat Der Unterschied zwischen NodeJS und Tomcat Apr 21, 2024 am 04:16 AM

Der Unterschied zwischen NodeJS und Tomcat

Der Unterschied zwischen NodeJS und VueJS Der Unterschied zwischen NodeJS und VueJS Apr 21, 2024 am 04:17 AM

Der Unterschied zwischen NodeJS und VueJS

Ist NodeJS ein Backend-Framework? Ist NodeJS ein Backend-Framework? Apr 21, 2024 am 05:09 AM

Ist NodeJS ein Backend-Framework?

Was ist der Unterschied zwischen den Dateien npm und npm.cmd im Installationsverzeichnis von nodejs? Was ist der Unterschied zwischen den Dateien npm und npm.cmd im Installationsverzeichnis von nodejs? Apr 21, 2024 am 05:18 AM

Was ist der Unterschied zwischen den Dateien npm und npm.cmd im Installationsverzeichnis von nodejs?

Ist NodeJS eine Back-End-Entwicklungssprache? Ist NodeJS eine Back-End-Entwicklungssprache? Apr 21, 2024 am 05:09 AM

Ist NodeJS eine Back-End-Entwicklungssprache?

Was sind die globalen Variablen in NodeJS? Was sind die globalen Variablen in NodeJS? Apr 21, 2024 am 04:54 AM

Was sind die globalen Variablen in NodeJS?

Gibt es einen großen Unterschied zwischen NodeJS und Java? Gibt es einen großen Unterschied zwischen NodeJS und Java? Apr 21, 2024 am 06:12 AM

Gibt es einen großen Unterschied zwischen NodeJS und Java?

Welches soll man zwischen NodeJS und Java wählen? Welches soll man zwischen NodeJS und Java wählen? Apr 21, 2024 am 04:40 AM

Welches soll man zwischen NodeJS und Java wählen?

See all articles