diff --git a/jetty-ee10/jetty-ee10-servlets/src/main/java/org/eclipse/jetty/ee10/servlets/DoSFilter.java b/jetty-ee10/jetty-ee10-servlets/src/main/java/org/eclipse/jetty/ee10/servlets/DoSFilter.java index d5566c5bb2b..4f1865d03f0 100644 --- a/jetty-ee10/jetty-ee10-servlets/src/main/java/org/eclipse/jetty/ee10/servlets/DoSFilter.java +++ b/jetty-ee10/jetty-ee10-servlets/src/main/java/org/eclipse/jetty/ee10/servlets/DoSFilter.java @@ -322,7 +322,7 @@ public class DoSFilter implements Filter tracker = getRateTracker(request); // Calculate the rate and check if it is over the allowed limit - final OverLimit overLimit = tracker.isRateExceeded(System.currentTimeMillis()); + final OverLimit overLimit = tracker.isRateExceeded(System.nanoTime()); // Pass it through if we are not currently over the rate limit. if (overLimit == null) @@ -1182,8 +1182,8 @@ public class DoSFilter implements Filter } /** - * @param now the time now (in milliseconds) - * @return the current calculated request rate over the last second + * @param now the time now (in nanoseconds) used to calculate elapsed time since previous requests. + * @return the current calculated request rate over the last second if rate exceeded, else null. */ public OverLimit isRateExceeded(long now) { @@ -1201,9 +1201,9 @@ public class DoSFilter implements Filter } long rate = (now - last); - if (rate < 1000L) + if (TimeUnit.NANOSECONDS.toSeconds(rate) < 1L) { - return new Overage(Duration.ofMillis(rate), _maxRequestsPerSecond); + return new Overage(Duration.ofNanos(rate), _maxRequestsPerSecond); } return null; } @@ -1292,7 +1292,7 @@ public class DoSFilter implements Filter int latestIndex = _next == 0 ? (_timestamps.length - 1) : (_next - 1); long last = _timestamps[latestIndex]; - boolean hasRecentRequest = last != 0 && (System.currentTimeMillis() - last) < 1000L; + boolean hasRecentRequest = last != 0 && TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - last) < 1L; DoSFilter filter = (DoSFilter)_context.getAttribute(_filterName); diff --git a/jetty-ee9/jetty-ee9-servlets/src/test/java/org/eclipse/jetty/ee9/servlets/DoSFilterTest.java b/jetty-ee9/jetty-ee9-servlets/src/test/java/org/eclipse/jetty/ee9/servlets/DoSFilterTest.java index 9a676c6d5d8..3d0f34a4a89 100644 --- a/jetty-ee9/jetty-ee9-servlets/src/test/java/org/eclipse/jetty/ee9/servlets/DoSFilterTest.java +++ b/jetty-ee9/jetty-ee9-servlets/src/test/java/org/eclipse/jetty/ee9/servlets/DoSFilterTest.java @@ -200,7 +200,7 @@ public class DoSFilterTest extends AbstractDoSFilterTest for (int i = 0; i < 5; i++) { Thread.sleep(sleep); - if (rateTracker.isRateExceeded(TimeUnit.NANOSECONDS.toMillis(System.nanoTime())) != null) + if (rateTracker.isRateExceeded(System.nanoTime()) != null) exceeded = true; } return exceeded;