我正在开发基于Spring和JSF 2.0的应用程序.需要记住特定IP地址的客户端在过去3分钟内尝试提交表单的次数.如果在3分钟内记录了超过3次提交尝试,则应显示验证码.
我正在考虑使用ConcurrentMap<String, ConcurrentLinkedQueue<Long>>存储ip地址(String)并在queue(ConcurrentLinkedQueue<Long>)中提交时间(milis ).Quartz将以3分钟的间隔清理队列(将删除3分钟以上的milis).要检查是否显示验证码,我将检查队列大小是否> 3.
这是正确的方法吗?你有更好的想法吗?
Java提供了一个用于存储IP地址的特殊类:java.net.InetAddress.Long与之不同的是,除了32位地址之外,它还能够处理128位地址,并且就String其使用的内存而言,它并不像在内存方面那样浪费,这在非常大量的情况下可能变得很重要.