Spring Boot 项目的 API 接口防刷
说明:使用了注解的方式进行对接口防刷的功能,非常高大上,本文章仅供参考 一,技术要点: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 接口防刷相关推荐
- Spring Boot 项目的jsp页面引用css、js、img、fonts的问题解决
Spring Boot 项目的jsp页面引用css.js.img.fonts的问题解决 我在刚开始用Spring Boot 写招聘网站时,jsp页面写好了,代码逻辑写好了,css.js.img.fon ...
- 面试官:如何做 API 接口防刷??
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:blog.csdn.net/weixin_42533856/ ...
- spring-boot:run 是怎么运行 Spring Boot 项目的?
初学 Spring Boot 的时候,按照官方文档,都是建立了一个项目之后,然后执行 mvn spring-boot:run 就能把这个项目运行起来. 我就很好奇这个指令到底做了什么,以及为什么项目里 ...
- Centos7国内环境下安装kubeadm、kubelet、kubectl并建立k8s集群、安装gitlab,测试spring boot 项目的CICD
一.建立k8s集群 1.官网安装: 安装kubeadm 安装k8s集群.安装k8s高可用集群 2.开始 1.防火墙 关闭防火墙: systemctl stop firewalld.service. 开 ...
- 创建一个 Spring Boot 项目的4种方法,你会几种?- 第396篇
相关历史文章(阅读本文前,您可能需要先看下之前的系列
- java接口防刷_API 接口防刷
API 接口防刷 顾名思义,想让某个接口某个人在某段时间内只能请求N次. 在项目中比较常见的问题也有,那就是连点按钮导致请求多次,以前在web端有表单重复提交,可以通过token 来解决. 除了上面的 ...
- 接口安全----接口防刷
私有:需要企业内部资源共享 内部接口 公有:短信平台,天气预报.... 接口安全要求: 1.防伪装攻击处理方式:接口防刷出现情况:公共网络环境中,第三方有意或者恶意调用我们的接口2.防篡改攻击处理方式 ...
- spring boot + redis 实现网站限流和接口防刷功能
源码url: https://github.com/zhzhair/accesslimit-spring-boot.git 注解@AccessLimit 实现接口防刷功能,在方法上的注解参数优先于类上 ...
- 创宇滤镜|API防刷|短信邮件接口防刷|验证码防刷|搜索防刷 - 知道创宇云安全
创宇滤镜|API防刷|短信邮件接口防刷|验证码防刷|搜索防刷 - 知道创宇云安全 创宇滤镜|API防刷|短信邮件接口防刷|验证码防刷|搜索防刷 - 知道创宇云安全 posted on 2017-02- ...
最新文章
- 安装Mysql提示1045错误解决方法
- java异常处理试题答案_Java 面试题和答案 - (下)
- java中的几种对话框_Java中弹出对话框中的几种方式
- 基于vue-cli配置手淘的lib-flexible + rem,实现移动端自适应
- Kubernetes(六) - Secret和私有仓库认证
- WCF消息之XmlDictionaryWriter
- Apache2.2.21安装图解
- 一步步实现SDDC-逻辑交换与逻辑路由
- element-ui可编辑行增加行或删除行
- 2021-08-13servlet 原理及注意事项
- java异常处理-小白学习中
- 参考文献标引方式_参考文献的标注方法
- C语言-打印菱形三角形等图形
- 北航计算机专业最低分,北京航空航天大学2020年本科录取线发布,最低分572
- [buuctf.reverse] 131-135
- 证监会叫停VR等行业跨界定增,福兮祸兮?
- 加州欧文计算机工程专业,加州大学欧文分校计算机工程排名第29(2018年TFE美国排名)...
- 减肥坚持不下去?一个立竿见影的方法
- win10升级win11(cpu/tpm不符合)亲测有效,保留数据
- 遥感(1):遥感是什么?