使用注解怎么实现一个SpringBoot接口防刷功能

  介绍

这篇文章将为大家详细讲解有关使用注解怎么实现一个SpringBoot接口防刷功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

项目结构如下:

使用注解怎么实现一个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接口防刷功能