黑名单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);
nodejs,黑名单
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]