一个注解搞定 SpringBoot 接口防刷,真香! | 您所在的位置:网站首页 › springboot暴露接口 › 一个注解搞定 SpringBoot 接口防刷,真香! |
大家好,我是猿人(猿码天地创始人),今天给大家聊聊接口防刷的那些事。 接口防刷,顾名思义,想让某个接口某个人在某段时间内只能请求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 实验室设备网 版权所有 |