Skip to content

Commit d00fafa

Browse files
author
Matheus Vieira
committed
add rate limit: 3 request per minute
1 parent 0a2d9e6 commit d00fafa

File tree

2 files changed

+94
-3
lines changed

2 files changed

+94
-3
lines changed

src/main/java/MyServlet.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,28 @@
66
import javax.servlet.http.HttpServletRequest;
77
import javax.servlet.http.HttpServletResponse;
88

9+
import utils.RateLimit;
10+
911
@WebServlet("/MyServlet")
1012
public class MyServlet extends HttpServlet {
1113

14+
RateLimit rateLimit;
15+
16+
public MyServlet() {
17+
if (rateLimit == null) {
18+
rateLimit = new RateLimit();
19+
}
20+
}
21+
1222
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
13-
response.setContentType("application/json");
14-
String json = "{\"status\": \"server running\"}";
15-
response.getWriter().write(json);
23+
24+
if (rateLimit.doFilter(request)) {
25+
response.setContentType("application/json");
26+
String json = "{\"status\": \"server running\"}";
27+
response.getWriter().write(json);
28+
} else {
29+
response.setStatus(429);
30+
}
1631
}
1732

1833
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

src/main/java/utils/RateLimit.java

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package utils;
2+
3+
import java.util.ArrayList;
4+
import java.util.Calendar;
5+
import java.util.concurrent.ConcurrentHashMap;
6+
import java.util.Map;
7+
8+
import javax.servlet.http.HttpServletRequest;
9+
10+
public class RateLimit {
11+
12+
private static final int MAX_REQUESTS = 3;
13+
private static final int INTERVAL = 1 * 60 * 1000; // 6000 ms || 1 min
14+
15+
private Map<String, ArrayList<Calendar>> requestsList;
16+
17+
public RateLimit() {
18+
requestsList = new ConcurrentHashMap<String, ArrayList<Calendar>>();
19+
}
20+
21+
public boolean doFilter(HttpServletRequest request) {
22+
23+
String sessionId = request.getSession().getId();
24+
Calendar currentTime = this.getCurrentTime();
25+
26+
if (requestsList.containsKey(sessionId)) {
27+
if (isAnExceedingRequest(sessionId)) {
28+
return false;
29+
}
30+
31+
requestsList.get(sessionId).add(currentTime);
32+
} else {
33+
ArrayList<Calendar> test = new ArrayList<Calendar>();
34+
test.add(currentTime);
35+
36+
requestsList.put(sessionId, test);
37+
}
38+
39+
return true;
40+
}
41+
42+
public Boolean isAnExceedingRequest(String sessionId) {
43+
44+
ArrayList<Calendar> requestsListArray = requestsList.get(sessionId);
45+
int requestsListArraySize = requestsListArray.size();
46+
Calendar currentTime = getCurrentTime();
47+
48+
if (requestsListArraySize < MAX_REQUESTS) {
49+
return false;
50+
}
51+
52+
int countRequestLessThanOneMinute = 0;
53+
54+
// getting the last items from list
55+
for (int i = 0; i < MAX_REQUESTS; i++) {
56+
57+
if ((currentTime.getTimeInMillis()
58+
- requestsListArray.get(requestsListArraySize - (i + 1)).getTimeInMillis()) < INTERVAL) {
59+
countRequestLessThanOneMinute++;
60+
}
61+
62+
}
63+
64+
if (countRequestLessThanOneMinute == MAX_REQUESTS) {
65+
return true;
66+
}
67+
68+
return false;
69+
}
70+
71+
public Calendar getCurrentTime() {
72+
Calendar now = Calendar.getInstance();
73+
return now;
74+
}
75+
76+
}

0 commit comments

Comments
 (0)