限制发送消息的频率

pull/23/head
taoshihan1991 3 years ago
parent be660b41bc
commit fa10fd642b

@ -128,7 +128,14 @@ func SendMessageV2(c *gin.Context) {
})
return
}
//限流
if !tools.LimitFreqSingle("sendmessage:"+c.ClientIP(), 1, 2) {
c.JSON(200, gin.H{
"code": 400,
"msg": c.ClientIP() + "发送频率过快",
})
return
}
var kefuInfo models.User
var vistorInfo models.Visitor
if cType == "kefu" {

@ -76,5 +76,5 @@
var LANG=checkLang();
</script>
<script src="/static/js/chat-lang.js?v=1.0.0"></script>
<script src="/static/js/chat-page.js?v=1.0.0"></script>
<script src="/static/js/chat-page.js?v=1.0.1"></script>
</html>

@ -109,6 +109,7 @@ new Vue({
mes.content = this.messageContent;
//发送消息
$.post("/2/message",mes,function(res){
_this.sendDisabled=false;
if(res.code!=200){
_this.$message({
message: res.msg,
@ -128,7 +129,6 @@ new Vue({
_this.messageContent = "";
clearInterval(_this.timer);
_this.sendSound();
_this.sendDisabled=false;
});
},
@ -137,7 +137,7 @@ new Vue({
if(this.socketClosed||!this.socket){
return;
}
console.log(this.messageContent);
//console.log(this.messageContent);
var message = {}
message.type = "inputing";
message.data = {

@ -0,0 +1,33 @@
package tools
import "time"
var LimitQueue map[string][]int64
var ok bool
//单机时间滑动窗口限流法
func LimitFreqSingle(queueName string, count uint, timeWindow int64) bool {
currTime := time.Now().Unix()
if LimitQueue == nil {
LimitQueue = make(map[string][]int64)
}
if _, ok = LimitQueue[queueName]; !ok {
LimitQueue[queueName] = make([]int64, 0)
}
//队列未满
if uint(len(LimitQueue[queueName])) < count {
LimitQueue[queueName] = append(LimitQueue[queueName], currTime)
return true
}
//队列满了,取出最早访问的时间
earlyTime := LimitQueue[queueName][0]
//说明最早期的时间还在时间窗口内,还没过期,所以不允许通过
if currTime-earlyTime <= timeWindow {
return false
} else {
//说明最早期的访问应该过期了,去掉最早期的
LimitQueue[queueName] = LimitQueue[queueName][1:]
LimitQueue[queueName] = append(LimitQueue[queueName], currTime)
}
return true
}
Loading…
Cancel
Save