首页
App
&
Coffee
文档
项目
分享
反馈
俱乐部
登录
注册
如何实现jfinal根据ip限制一分钟内访问频率过快?【已解决】
fmpoffice
2018-03-02 08:56
利用jfinal的IpKit工具获取用户发起请求的ip,判断这个ip内是否进行爬虫等连续性循环的功能?如果是则进行提供“请勿频繁访问”。
请问各位大哥,这个功能应该怎么实现?
项目:
JFinal
12
4
评论区
海哥
2018-03-02 09:02
参考jboot的实现吧,https://gitee.com/fuhai/jboot/tree/master/src/main/java/io/jboot/web/limitation/annotation 不仅可以对单个ip限制,还可以对当前并发限制,或者单个用户限制,或者访问总频率设置。
回复
海哥
2018-03-02 09:07
使用文档:https://gitee.com/fuhai/jboot/blob/master/DOC.md#%E9%99%90%E6%B5%81%E5%92%8C%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6
回复
JFinal
2018-03-02 11:36
用一下 jfinal 中整合的 ehcache,关键配置是下面几个:
name="block"
timeToIdleSeconds="3000"
timeToLiveSeconds="0"
timeToIdleSeconds 为 3000 表示空闲时间达到 5 分钟即清除这个缓存,timeToLiveSeconds 为 0 表示缓存最大存活时间为永远,也就是说缓存清除交由第一个配置 timeToIdleSeconds 来控制
再做个拦截器,得到请求的 ip 地址为 key 值进行一些逻辑操作,大致如下:
String ip = IpUtils.getClientIp(inv.getController().getRequest());
Integer counter = CacheKit.get("block", ip);
if (counter == null) {
counter = 1;
CacheKit.put("block", ip, counter);
inv.invoke();
return ;
}
counter++;
CacheKit.put("block", ip, counter);
if (counter < MAX_VALUE) {
inv.invoke();
} else {
inv.getController().renderJson("msg", "访问太频繁");
}
回复
小徐同学
2018-03-02 13:36
@JFinal
哈哈,这个就很方便了
回复
JFinal
2018-03-02 16:41
补充一下,合理设置 timeToIdleSeconds 的值与 程序中的 MAX_VALUE 值,调整出你自己想要的策略
回复
马小酱
2018-03-03 11:53
mark
回复
玛雅牛
2018-03-04 11:50
使用nginx反向代理到业务系统,nginx中很好实现,taobao的Tengine可以实现更精细的流控。
回复
fmpoffice
2018-03-10 11:10
@JFinal
非常感谢您提供的思路,灵活地运用了ehcache进行ip限制访问。
回复
zfxml
2020-04-10 12:35
@JFinal
怎么设置问题上的一分钟呢?
回复
zfxml
2020-04-10 13:12
@JFinal
ehcache中的存活时间到了,但是空闲时间没到,没有过期,怎么设置他俩的优先级呢?
回复
zfxml
2020-04-10 13:50
@JFinal
您这里说的timeToLiveSeconds是最大存活时间,那么到了时间,缓存不就被清除了吗?但是实际并不会被清除
回复
发送
我要反馈
热门反馈
扫码入社