首页 > 编程语言 >java 实现接口频次限制

java 实现接口频次限制

时间:2022-10-12 11:14:42浏览次数:51  
标签:java request 接口 频次 LimitRequest org limitRequest import

1、添加依赖

        <dependency>
            <groupId>net.jodah</groupId>
            <artifactId>expiringmap</artifactId>
            <version>0.5.10</version>
        </dependency>

2、新建注解

package com.qax.situation.transmission.application.annoation;

import java.lang.annotation.*;

@Documented
@Target(ElementType.METHOD) // 说明该注解只能放在方法上面
@Retention(RetentionPolicy.RUNTIME)
public @interface LimitRequest {
    long time() default 60000; // 限制时间 单位:毫秒

    int count() default Integer.MAX_VALUE; // 允许请求的次数
}

3、自定义AOP切面

package com.qax.situation.transmission.application.annoation;

import com.qax.needle.common.constant.HttpStatus;
import com.qax.needle.framework.boot.exception.BaseException;
import net.jodah.expiringmap.ExpirationPolicy;
import net.jodah.expiringmap.ExpiringMap;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;


@Aspect
@Component
public class LimitRequestAspect {
    private static ConcurrentHashMap<String, ExpiringMap<String, Integer>> book = new ConcurrentHashMap<>();

    // 定义切点
    // 让所有有@LimitRequest注解的方法都执行切面方法
    @Pointcut("@annotation(limitRequest)")
    public void excudeService(LimitRequest limitRequest) {
    }

    @Around("excudeService(limitRequest)")
    public Object doAround(ProceedingJoinPoint pjp, LimitRequest limitRequest) throws Throwable {

        // 获得request对象
        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
        ServletRequestAttributes sra = (ServletRequestAttributes) ra;
        HttpServletRequest request = sra.getRequest();

        // 获取Map对象, 如果没有则返回默认值
        // 第一个参数是key, 第二个参数是默认值
        ExpiringMap<String, Integer> uc = book.getOrDefault(request.getRequestURI(), ExpiringMap.builder().variableExpiration().build());
        Integer nowCount = uc.getOrDefault(request.getRemoteAddr(), 0);


        if (nowCount >= limitRequest.count()) { // 超过次数,不执行目标方法
            throw new BaseException(HttpStatus.PERMISSION_DENIED, "", "接口请求超过次数");
            //return JsonResult.error("请求次数过多,已经限制");
        } else if (nowCount == 0) { // 第一次请求时,设置有效时间
//            /** Expires entries based on when they were last accessed */
//            ACCESSED,
//            /** Expires entries based on when they were created */
//            CREATED;
            uc.put(request.getRemoteAddr(), nowCount + 1, ExpirationPolicy.CREATED, limitRequest.time(), TimeUnit.MILLISECONDS);
        } else { // 未超过次数, 记录加一
            uc.put(request.getRemoteAddr(), nowCount + 1);
        }
        book.put(request.getRequestURI(), uc);

        // result的值就是被拦截方法的返回值
        return pjp.proceed();
    }
}

4、在函数上添加注解

@LimitRequest(count = 10)

 

标签:java,request,接口,频次,LimitRequest,org,limitRequest,import
From: https://www.cnblogs.com/shangwei/p/16783792.html

相关文章

  • Java控制台简易计算器(两数运算)
    Java控制台简易计算器(两数运算)源代码使用while循环,Scanner方法,Switch语句实现交互效果packagecom.ge.method;importjava.util.Scanner;publicclassDemo04{......
  • java笔记
    代码规范命名规范项目名:见名知意,英文,小写包名:公司反域名;小写类名:见名知意,驼峰原则,不能有特殊符号,支持_,数字不能放开头类名如果有多个单词,每个单词大......
  • Java 做项目能用到 Map 哪些功能?这篇总结全了
    在Java的集合框架里除了Collection类族外还有Map类族,在Java中Collection类族表示存储着对象的各种集合数据结构,而Map类族则表示存储着键值对的映射表数据结构。......
  • Java基础(三)| switch、循环及Random详解
    ⭐本专栏旨在对JAVA的基础语法及知识点进行全面且详细的讲解,完成从0到1的java学习,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握JAVA编程,同时为后续的框架学习,进阶开......
  • 力扣350(java&python)-两个数组的交集 II(简单)
    题目:给你两个整数数组 nums1和nums2,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑......
  • java求最大递增子序列算法
    求最大递增子序列:packagecom.test.algorithm;importjava.util.Arrays;/***CreatedbyAdministratoron2022/10/12.*/publicclassMaxIncrSub{/*......
  • Jmeter socket接口测试
    由于公司要进行对接银行的国密改造项目进行压测,项目采用socket接口进行调用,网上找到「不是Z君」的原创文章。socket简介什么是socket呢?我们经常把socket翻译为套接字,socke......
  • 尚硅谷-JavaWeb Day8 Filter、Json、Ajax
    1.Filter过滤器(JavaEE的规范,也是接口)作用:拦截请求、过滤响应;(应用于权限检查、日记操作、事务管理等等)①基本使用(通过判断session域中是否包含用户信......
  • Java代码审计之实战某博客
    对某博客的代码审计在gitee上面找了一个个人博客项目,来进行实战代码审计,主要还是学习为主技术菜菜,哪里错误希望师傅们指正1、SQL注入先了解JavaWeb中的数据传输流程g......
  • 【java报错】java运行jar命令提示没有主清单属性
    java运行jar命令提示没有主清单属性在JAVA中将class文件编译成jar文件包,运行提示没有主清单属性。这是怎么回事?今天来教大家如何解决这个问题1、在java中编译JAR文件的......