说明:使用了注解的方式进行对接口防刷的功能,非常高大上,本文章仅供参考 一,技术要点:springboot的基本知识,redis基本操作,

首先是写一个注解类:

import java.lang.annotation.Retention;
import java.lang.annotation.Target;import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;/*** @author yhq* @date 2018/9/10 15:52*/@Retention(RUNTIME)
@Target(METHOD)
public @interface AccessLimit {int seconds();int maxCount();boolean needLogin()default true;
}

拦截器中实现:

import com.alibaba.fastjson.JSON;
import com.example.demo.action.AccessLimit;
import com.example.demo.redis.RedisService;
import com.example.demo.result.CodeMsg;
import com.example.demo.result.Result;
import org.springframework.beans.factory.annotation.Autowired;
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;/*** @author yhq* @date 2018/9/10 16:05*/@Component
public class FangshuaInterceptor extends HandlerInterceptorAdapter {@Autowiredprivate RedisService redisService;@Overridepublic 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进行判断//.....key+=""+"1";  //这里假设用户是1,项目中是动态获取的userId}//从redis中获取用户访问的次数AccessKey ak = AccessKey.withExpire(seconds);Integer count = redisService.get(ak,key,Integer.class);if(count == null){//第一次访问redisService.set(ak,key,1);}else if(count < maxCount){//加1redisService.incr(ak,key);}else{//超出访问次数render(response,CodeMsg.ACCESS_LIMIT_REACHED); //这里的CodeMsg是一个返回参数return false;}}return true;}private void render(HttpServletResponse response, CodeMsg cm)throws Exception {response.setContentType("application/json;charset=UTF-8");OutputStream out = response.getOutputStream();String str  = JSON.toJSONString(Result.error(cm));out.write(str.getBytes("UTF-8"));out.flush();out.close();}
}

注册到springboot中

import com.example.demo.ExceptionHander.FangshuaInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;/*** @author yhq* @date 2018/9/10 15:58*/
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {@Autowiredprivate FangshuaInterceptor interceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(interceptor);}
}

在Controller中加入注解

import com.example.demo.result.Result;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** @author yhq* @date 2018/9/10 15:49*/@Controller
public class FangshuaController {@AccessLimit(seconds=5, maxCount=5, needLogin=true)@RequestMapping("/fangshua")@ResponseBodypublic Result<String> fangshua(){return Result.success("请求成功");}

Spring Boot 项目的 API 接口防刷相关推荐

  1. Spring Boot 项目的jsp页面引用css、js、img、fonts的问题解决

    Spring Boot 项目的jsp页面引用css.js.img.fonts的问题解决 我在刚开始用Spring Boot 写招聘网站时,jsp页面写好了,代码逻辑写好了,css.js.img.fon ...

  2. 面试官:如何做 API 接口防刷??

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:blog.csdn.net/weixin_42533856/ ...

  3. spring-boot:run 是怎么运行 Spring Boot 项目的?

    初学 Spring Boot 的时候,按照官方文档,都是建立了一个项目之后,然后执行 mvn spring-boot:run 就能把这个项目运行起来. 我就很好奇这个指令到底做了什么,以及为什么项目里 ...

  4. Centos7国内环境下安装kubeadm、kubelet、kubectl并建立k8s集群、安装gitlab,测试spring boot 项目的CICD

    一.建立k8s集群 1.官网安装: 安装kubeadm 安装k8s集群.安装k8s高可用集群 2.开始 1.防火墙 关闭防火墙: systemctl stop firewalld.service. 开 ...

  5. 创建一个 Spring Boot 项目的4种方法,你会几种?- 第396篇

    相关历史文章(阅读本文前,您可能需要先看下之前的系列

  6. java接口防刷_API 接口防刷

    API 接口防刷 顾名思义,想让某个接口某个人在某段时间内只能请求N次. 在项目中比较常见的问题也有,那就是连点按钮导致请求多次,以前在web端有表单重复提交,可以通过token 来解决. 除了上面的 ...

  7. 接口安全----接口防刷

    私有:需要企业内部资源共享 内部接口 公有:短信平台,天气预报.... 接口安全要求: 1.防伪装攻击处理方式:接口防刷出现情况:公共网络环境中,第三方有意或者恶意调用我们的接口2.防篡改攻击处理方式 ...

  8. spring boot + redis 实现网站限流和接口防刷功能

    源码url: https://github.com/zhzhair/accesslimit-spring-boot.git 注解@AccessLimit 实现接口防刷功能,在方法上的注解参数优先于类上 ...

  9. 创宇滤镜|API防刷|短信邮件接口防刷|验证码防刷|搜索防刷 - 知道创宇云安全

    创宇滤镜|API防刷|短信邮件接口防刷|验证码防刷|搜索防刷 - 知道创宇云安全 创宇滤镜|API防刷|短信邮件接口防刷|验证码防刷|搜索防刷 - 知道创宇云安全 posted on 2017-02- ...

最新文章

  1. 安装Mysql提示1045错误解决方法
  2. java异常处理试题答案_Java 面试题和答案 - (下)
  3. java中的几种对话框_Java中弹出对话框中的几种方式
  4. 基于vue-cli配置手淘的lib-flexible + rem,实现移动端自适应
  5. Kubernetes(六) - Secret和私有仓库认证
  6. WCF消息之XmlDictionaryWriter
  7. Apache2.2.21安装图解
  8. 一步步实现SDDC-逻辑交换与逻辑路由
  9. element-ui可编辑行增加行或删除行
  10. 2021-08-13servlet 原理及注意事项
  11. java异常处理-小白学习中
  12. 参考文献标引方式_参考文献的标注方法
  13. C语言-打印菱形三角形等图形
  14. 北航计算机专业最低分,北京航空航天大学2020年本科录取线发布,最低分572
  15. [buuctf.reverse] 131-135
  16. 证监会叫停VR等行业跨界定增,福兮祸兮?
  17. 加州欧文计算机工程专业,加州大学欧文分校计算机工程排名第29(2018年TFE美国排名)...
  18. 减肥坚持不下去?一个立竿见影的方法
  19. win10升级win11(cpu/tpm不符合)亲测有效,保留数据
  20. 遥感(1):遥感是什么?

热门文章

  1. Docker部署微服务详解
  2. AJPFX关于StringBuffer类的总结
  3. Android 从清单配置文件元数据中获取值
  4. « android通过xml配置实现的动画效果milestone的基本信息 » android...
  5. 关于Static控件背景透明时文本覆盖重影的问题
  6. Linux configure 参数解释,程序的这装,卸载
  7. nginx反向代理、负载均衡以及分布式下的session保持
  8. HTML5中的websocket实现直播
  9. java中向JTextArea中添加滚动条(垂直的和水平的)
  10. Fabric权限管理和策略