4

我正在开发一个基于 Spring 和 JSF 2.0 的应用程序。需要记住在过去 3 分钟内来自特定 IP 地址的客户端尝试提交表单的次数。如果在 3 分钟内记录了超过 3 次提交尝试,则应显示验证码。

我正在考虑使用在队列()中ConcurrentMap<String, ConcurrentLinkedQueue<Long>>存储 ip 地址(String)和提交时间(milis ConcurrentLinkedQueue<Long>)。Quartz 将每隔 3 分钟清理一次队列(超过 3 分钟的 milis 将被删除)。要检查是否显示验证码,我将检查队列大小是否 > 3。

这是正确的方法吗?你有更好的想法吗?

4

2 回答 2

7

Java 提供了一个特殊的类来存储 IP 地址:java.net.InetAddress. 与 不同Long的是,除了 32 位地址之外,它还能够处理 128 位地址,并且就String它使用的内存而言,它不像 a 那样浪费,这在非常大容量的情况下可能变得很重要。

于 2012-07-27T14:29:08.413 回答
2

就个人而言,我将我的 IP 存储为 Longs 而不是 Strings。

您将看到性能提升。

于 2012-07-27T14:25:43.450 回答