docs(website): 添加简记memo产品原型和UI设计规范文档
- 新增「简记memo」一体化小程序产品原型设计文档 - 新增简记memo完整版UI视觉设计规范和界面细节 - 添加IDEA项目配置文件.gitignore - 创建404页面HTML文件,包含响应式布局和错误提示 - 添加关于页面HTML文件,展示品牌介绍和团队信息 - 实现AES加解密工具函数,支持请求体加密 - 添加用户协议页面基础框架
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
// IP限流:防刷、高并发保护
|
||||
package middleware
|
||||
|
||||
import (
|
||||
"simple-memo/global"
|
||||
"simple-memo/utils"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func Limiter() gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
key := "limiter:" + c.ClientIP()
|
||||
ctx := c.Request.Context()
|
||||
|
||||
// 10秒内请求次数+1
|
||||
global.Redis.Incr(ctx, key)
|
||||
global.Redis.Expire(ctx, key, 10*time.Second)
|
||||
|
||||
// 转成数字再比较
|
||||
countStr := global.Redis.Get(ctx, key).Val()
|
||||
count, _ := strconv.Atoi(countStr)
|
||||
|
||||
// 10秒最多 100 次(正常开发完全够用)
|
||||
if count > 100 {
|
||||
utils.Fail(c, "请求过于频繁")
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
c.Next()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user