@@ -11,11 +11,14 @@ public class RateLimit {
1111
1212 private static final int MAX_REQUESTS = 3 ;
1313 private static final int INTERVAL = 1 * 60 * 1000 ; // 6000 ms || 1 min
14+ private static final int BLOCKED_TIME = 2 * 60 * 1000 ; //1200 ms || 2min
1415
1516 private Map <String , ArrayList <Calendar >> requestsList ;
17+ private Map <String , Calendar > blockedList ;
1618
1719 public RateLimit () {
1820 requestsList = new ConcurrentHashMap <String , ArrayList <Calendar >>();
21+ blockedList = new ConcurrentHashMap <String , Calendar >();
1922 }
2023
2124 public boolean doFilter (HttpServletRequest request ) {
@@ -24,6 +27,10 @@ public boolean doFilter(HttpServletRequest request) {
2427 Calendar currentTime = this .getCurrentTime ();
2528
2629 if (requestsList .containsKey (sessionId )) {
30+ if (isInBlockedList (sessionId )) {
31+ return false ;
32+ }
33+
2734 if (isAnExceedingRequest (sessionId )) {
2835 return false ;
2936 }
@@ -62,9 +69,28 @@ public Boolean isAnExceedingRequest(String sessionId) {
6269 }
6370
6471 if (countRequestLessThanOneMinute == MAX_REQUESTS ) {
72+ blockedList .put (sessionId , currentTime );
73+
74+ return true ;
75+ }
76+
77+ return false ;
78+ }
79+
80+ public Boolean isInBlockedList (String sessionId ) {
81+ Calendar currentTime = getCurrentTime ();
82+ Calendar blockTime = blockedList .get (sessionId );
83+
84+ if (blockTime == null ) {
85+ return false ;
86+ }
87+
88+ if ((currentTime .getTimeInMillis () - blockTime .getTimeInMillis ()) < BLOCKED_TIME ) {
6589 return true ;
6690 }
6791
92+ blockedList .remove (sessionId );
93+
6894 return false ;
6995 }
7096
0 commit comments