介绍
这篇文章将为大家详细讲解有关使用注解怎么实现一个SpringBoot接口防刷功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
项目结构如下:
一、编写注解类AccessLimit
package cn.mygweb.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/* * ,*访问控制注解(实现接口防刷功能) ,*/@Retention (RetentionPolicy.RUNTIME) @Target (ElementType.METHOD) public @interface  AccessLimit { ,/* * ,,*,限制周期(单位为秒) ,,* ,,* @return ,,*/int 才能秒(); ,/* * ,,*,规定周期内限制次数 ,,* ,,* @return ,,*/int 才能maxCount (); ,/* * ,,*,是否需要登录 ,,* ,,* @return ,,*/boolean 才能;needLogin (), default 假; }
二,在拦截拦截器中实现拦截逻辑
package cn.mygweb.interceptor; import cn.mygweb.annotation.AccessLimit; import cn.mygweb.entity.Result; import cn.mygweb.entity.StatusCode; import com.alibaba.fastjson.JSON; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.OutputStream; import java.util.HashMap; import java.util.Map;/* * ,*访问控制拦截器 ,*/@ component public class  AccessLimitInterceptor extends HandlerInterceptorAdapter  {//模才能拟数据存储,实际业务中可以自定义实现方式 private 才能;static  Map<字符串,,AccessInfo>, accessInfoMap =, new HashMap<在(); @Override才能 public 才能;boolean  preHandle (HttpServletRequest 请求,HttpServletResponse 反应, ,,,,,,,,,,,,,,Object 处理程序),throws Exception { ,,,//判断请求是否属于方法的请求 ,,,if (handler instanceof  HandlerMethod), { ,,,,,HandlerMethod hm =, (HandlerMethod),处理程序; ,,,,,//获取方法中的注解,看是否有该注解 ,,,,,AccessLimit AccessLimit =, hm.getMethodAnnotation (AccessLimit.class); ,,,,,if (accessLimit ==, null), { ,,,,,,,return 真实; ,,,,,} ,,,,,int seconds =, accessLimit.seconds (); ,,,,,int maxCount =, accessLimit.maxCount (); ,,,,,boolean needLogin =, accessLimit.needLogin (); ,,,,,String key =, request.getRequestURI (); ,,,,,//如果需要登录 ,,,,,if (needLogin), { ,,,,,,,//获取登录的会话进行判断 ,,,,,,,//? ,,,,,,,key +=,,,,, +,“userA"//这里假设用户是userA,实际项目中可以改为userId ,,,,,} ,,,,,//模拟从复述中获取数据 ,,,,,AccessInfo AccessInfo =, accessInfoMap.get(关键); ,,,,,if (accessInfo ==, null), { ,,,,,,,//第一次访问 ,,,,,,,accessInfo =, new AccessInfo (); ,,,,,,,accessInfo.setFirstVisitTimestamp (System.currentTimeMillis ()); ,,,,,,,accessInfo.setAccessCount (1); ,,,,,,,accessInfoMap.put(钥匙,,accessInfo); ,,,,,},else if (accessInfo.getAccessCount (), & lt;, maxCount), { ,,,,,,,//访问次数加1 ,,,,,,,accessInfo.setAccessCount (accessInfo.getAccessCount (), +, 1); ,,,,,,,accessInfoMap.put(钥匙,,accessInfo); ,,,,,},{else ,,,,,,,//超出访问次数,判断时间是否超出设定时间 null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null使用注解怎么实现一个SpringBoot接口防刷功能