在应用程序中存储IP地址的最佳方法是什么?

4
我正在开发一个基于Spring和JSF 2.0的应用程序。有一个要求是在过去的3分钟内记住特定IP地址的客户端尝试提交表单的次数。如果在3分钟内记录了超过3次提交尝试,则应显示验证码。
我考虑使用ConcurrentMap<String, ConcurrentLinkedQueue<Long>>来存储ip地址(String)和队列(ConcurrentLinkedQueue<Long>)中的提交时间(毫秒)。Quartz将在3分钟间隔内清理队列(删除3分钟以上的毫秒)。为了检查是否显示验证码,我将检查队列大小是否大于3。
这种方法正确吗?您有更好的想法吗?

您需要按IP范围搜索吗? - sinuhepop
2个回答

7
Java提供了一个特殊的类来存储IP地址:java.net.InetAddress。与Long不同的是,它可以处理128位地址和32位地址,并且在内存使用方面不像String那么浪费,这在高流量情况下可能变得很重要。

好的,那么将提交时间存储在ConcurrentLinkedQueue<Long>中,并通过Quartz在3分钟间隔内进行清理的概念怎么样?可以吗? - michal777
@michal777 不,你应该每分钟清除一次,而不是每三分钟。考虑这种情况:在清理作业运行时,您有一个两分钟前的请求,该请求保留在队列中。再过两分钟,该请求仍将保留在队列中,即使现在已经过去了四分钟。另一种选择是在检查队列大小大于3的同时测试队列中项目的年龄。 - Sergey Kalinichenko

2

个人而言,我将IP存储为长整型而不是字符串。

你会看到性能有所提升。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接