请教限制同一ip访问次数如何写

在一分钟内,同一ip访问超过3次,就跳转。然后要等10分钟后这个IP才能继续访问。
如果他又在一分钟内访问超过3次又跳转。
他只要没在一分钟内达到3次就没问题。

请问我这个要求,下面代码好像不行。
下面的代码只能做到同一ip访问一旦超过3次就跳转。

<%
Dim i, t
i = 0
t = Time()
If Request.Cookies("QueryCounter").HasKeys Then
If IsNumeric(Request.Cookies("QueryCounter")("Counter")) AND IsDate(Request.Cookies("QueryCounter")("Time")) Then
i = CInt(Request.Cookies("QueryCounter")("Counter"))
t = CDate(Request.Cookies("QueryCounter")("Time"))
End If
End If
If i <= 3 AND DateDiff("n", t, Time()) <= 1 Then
Response.Cookies("QueryCounter")("Counter") = i + 1
Response.Cookies("QueryCounter")("Time") = t
Response.Cookies("QueryCounter").Expires = DateAdd("n",10,Now())
Else
跳转
End If
%>
阅读 3.8k
1 个回答

居然能看到 VB 的问题……

一般这种东西都是配合 Redis 或其他中间件来做的。这东西不应该存 Cookies 里啊……浏览器或者说客户端可以删掉它的啊……而且你这不是限 IP、是限浏览器啊,用户换个 IP(家庭宽带重连或者公司回到家里)但是不换浏览器,你这样也会给拦住的。

先按你这个 Cookies 来的吧,可以给你个思路(答案不唯一,方式方法可以很多种,这里只给一种做参考)。

你可以每次访问时往 Cookies 里存一个不同的 Key,比如第一个访问存 Key_1、第二次访问存 Key_2、以此类推。其中 Key_ 是个固定的前缀,你随便起,因为你可能 Cookies 里不只会存它,还会有别的东西,只要这个前缀能跟其他的 Cookies 区分开来就可以。而后面的数字不一定非得是个递增的数字,只要不会重复就可以了,比如你可以拿当前时间的分秒拼一下字符串,Key_5802 这种的(为什么不需要年月日和小时下面讲)。

至于这些 Cookies 的值,不重要,随便存一个就行,比如字符串 "1" 就行。

然后重点来了,这类 Cookies 的过期时间你要设置成 1 分钟就过期,过期的 Cookies 会被浏览器自动丢弃。这样你每次只需要遍历 Cookies 里所有 Key_ 开头的项,看它的个数是否超过了 3 个,超过了就阻拦请求。

而前面为啥不用年月日和小时就很好理解了,因为你这个 1 分钟就过期了,即便不存年月日小时,这些 Key 也不会在某一个时刻出现重复冲突的可能。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题