如何实现jfinal根据ip限制一分钟内访问频率过快?【已解决】

利用jfinal的IpKit工具获取用户发起请求的ip,判断这个ip内是否进行爬虫等连续性循环的功能?如果是则进行提供“请勿频繁访问”。

请问各位大哥,这个功能应该怎么实现?

评论区

海哥

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

玛雅牛

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是最大存活时间,那么到了时间,缓存不就被清除了吗?但是实际并不会被清除