springboot项目限制接口外部访问频率 每秒钟接口访问次数不得超过1次(使用ConcurrentHashMap实现)

矫情吗;* 2023-10-10 16:49 146阅读 0赞

使用Java内置的ConcurrentHashMap来实现接口访问频率限制。具体实现方法如下:

创建一个ConcurrentHashMap对象,用于存储每个请求的访问次数和时间戳。我们可以将其定义为一个静态变量,确保在多个请求之间共享。

  1. private static ConcurrentHashMap<String, Long> requestCountMap = new ConcurrentHashMap<>();

创建一个限制方法访问频率的方法,该方法需要在接口方法中调用。该方法需要获取当前请求的IP地址和URI,并计算该请求与上一次请求的时间间隔。如果时间间隔小于1秒钟,则返回false,否则返回true。如果返回true,则将当前请求的时间戳存储到ConcurrentHashMap中,并将访问次数设置为1。如果返回false,则将访问次数加1。

  1. private boolean limitRequestFrequency(HttpServletRequest request) {
  2. String ip = request.getRemoteAddr();
  3. String uri = request.getRequestURI();
  4. String key = ip + ":" + uri;
  5. Long lastRequestTime = requestCountMap.get(key);
  6. long now = System.currentTimeMillis();
  7. if (lastRequestTime != null && (now - lastRequestTime) < 1000) {
  8. return false;
  9. }
  10. requestCountMap.put(key, now);
  11. return true;
  12. }

在接口方法中调用限制访问频率的方法。如果该方法返回false,则说明请求未通过访问频率限制,需要返回429状态码和提示信息;否则,说明请求通过了访问频率限制,可以继续执行接口方法。

  1. @GetMapping("/hello")
  2. public String hello(HttpServletRequest request, HttpServletResponse response) {
  3. if (!limitRequestFrequency(request)) {
  4. response.setStatus(429);
  5. return "Too many requests";
  6. }
  7. return "Hello, World!";
  8. }

在以上实现中,我们使用Java内置的ConcurrentHashMap来实现了每秒钟接口访问次数不得超过1次的接口访问频率限制。需要注意的是,如果有多个请求同时访问同一个接口,可能会出现线程安全问题,需要进行处理。

发表评论

表情:
评论列表 (有 0 条评论,146人围观)

还没有评论,来说两句吧...

相关阅读