一个注解搞定 SpringBoot 接口防刷,真香! 您所在的位置:网站首页 springboot暴露接口 一个注解搞定 SpringBoot 接口防刷,真香!

一个注解搞定 SpringBoot 接口防刷,真香!

2023-09-25 14:12| 来源: 网络整理| 查看: 265

大家好,我是猿人(猿码天地创始人),今天给大家聊聊接口防刷的那些事。

接口防刷,顾名思义,想让某个接口某个人在某段时间内只能请求N次,或者某个接口对外在某一段时间内只允许访问N次。在项目中比较常见的问题也有,那就是连点按钮导致请求多次,以前在web端有表单重复提交,可以通过token 来解决。除了上面的方法外,前后端配合的方法。现在全部由后端来控制。

我是「猿码天地」,一个热爱技术、热爱编程的IT猿。技术是开源的,知识是共享的!

写作是对自己学习的总结和记录,如果您对 Java、分布式、微服务、中间件、Spring Boot、Spring Cloud等技术感兴趣,可以关注我的动态,我们一起学习,一起成长!

用知识改变命运,让家人过上更好的生活,互联网人一家亲!

Java知识学堂:https://gitee.com/zhangbw666/it-knowledge

好,废话不多说,直接干,进入正题:Good Good Study,Day Day Up!

技术要求:SpringBoot相关技术、Redis相关技术。

API 接口防刷原理

在你请求的时候,服务器通过redis 记录下你请求的次数,如果次数超过限制就不给访问。

在redis 保存的key 是有时效性的,过期就会删除。

好,我们直接用代码来实现接口防刷,猿人已运用到实际项目中,感觉还是挺香的,特地分享出来!

注解类

首先定义一个注解类,包含失效时间 单位(秒)、最大请求次数、是否需要登录三个属性。

/**  * fas-cbs  * 

接口防刷注解类

 * @author : zhang.bw  * @date : 2021-03-08 16:07  **/ @Retention(RUNTIME) @Target(METHOD) public @interface AccessLimit {  // 失效时间 单位(秒)  int seconds();  // 最大请求次数  int maxCount();  // 是否需要登录  boolean needLogin()default true; } 实现拦截器

定义好注解类后,需要在Interceptor拦截器中实现具体逻辑。

/**  * fas-cbs  * 

在Interceptor拦截器中实现

 * @author : zhang.bw  * @date : 2021-03-08 16:24  **/ @Component public class LimitInterceptor extends HandlerInterceptorAdapter {  @Override  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {   //判断请求是否属于方法的请求   if(handler instanceof HandlerMethod){    HandlerMethod hm = (HandlerMethod) handler;    //获取方法中的注解,看是否有该注解    AccessLimit accessLimit = hm.getMethodAnnotation(AccessLimit.class);    if(accessLimit == null){     return true;    }    int seconds = accessLimit.seconds(); // 失效时间 单位(秒)    int maxCount = accessLimit.maxCount(); // 最大请求次数    boolean login = accessLimit.needLogin(); // 是否需要登录    String key = request.getRequestURI();    //如果需要登录    if(login){     //获取登录的session进行判断     UserInfo systemUser = SystemUserUtil.getSystemUser(request);     String userNo = systemUser.getUserNo();     key+=""+userNo;    }    Integer count = 0;    //从redis中获取用户访问的次数    if(RedisUtil.get(key) != null){     count = (Integer) RedisUtil.get(key);    }    if(count == 0){     //第一次访问     RedisUtil.set(key,1);     RedisUtil.expire(key,seconds); //置缓存失效时间(单位:秒)    }else if(count 


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有