我在想如何限制Java中每個客戶端(每個特定IP)的TCP請求。例如,我希望允許每個客戶端IP每Y個請求最多X個請求。我想到使用靜態Timer/TimerTask與臨時受限IP的HashSet結合使用。限制每個IP的TCP請求
private static final Set<InetAddress> restrictedIPs = Collections.synchronizedSet(new HashSet<InetAddress>());
private static final Timer restrictTimer = new Timer();
因此,當用戶連接到服務器時,我自己的IP地址添加到限制列表中,並啓動任務取消限制他X秒。
restrictedIPs.add(socket.getInetAddress());
restrictTimer.schedule(new TimerTask()
{
public void run()
{
restrictedIPs.remove(socket.getInetAddress());
}
}, MIN_REQUEST_INTERVAL);
我的問題是,在當時的任務將運行,Socket對象可以被關閉,遠程IP地址將無法訪問了...
任何想法歡迎!另外,如果有人知道一個Java框架內置的方式來實現這一點,我真的很想聽到它。
感謝您的回答!正如你所說,我可能會做一個地圖。 – asmo 2010-06-02 08:24:47
就這個解決方案的問題:如何確定何時從地圖上刪除IP?因爲如果服務器運行很長時間,它最終將會包含數千個IP地圖。 – asmo 2010-06-02 08:50:56
幾千不應該是一個問題,但我理解你的關心。您可以安排每隔一小時左右執行一次清理,以刪除所有舊的IP(比一個小時更早)。 – Marc 2010-06-02 08:53:55