Springboot项目的接口防刷(实例)
技术要点: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;
- }
接着就是在Interceptor拦截器中实现:
- 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 {
- @Autowired
- private RedisService redisService;
- @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进行判断
- //.....
- 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){
- //加1
- redisService.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();
- }
- }
再把Interceptor注册到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 {
- @Autowired
- private FangshuaInterceptor interceptor;
- @Override
- public 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")
- @ResponseBody
- public Result<String> fangshua(){
- return Result.success("请求成功");
- }
本文有参考其他视频的教学,希望可以帮助更多热爱it行业的人。
本人免费整理了Java高级资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程,一共30G,需要自己领取。
传送门:https://mp.weixin.qq.com/s/osB-BOl6W-ZLTSttTkqMPQ
Springboot项目的接口防刷(实例)的更多相关文章
- [转]Springboot项目的接口防刷的实例
来源:微信公众号 马士兵 原地址:https://mp.weixin.qq.com/s/tHQcWwIt4c41IUnvCQ2QWA 说明:使用了注解的方式进行对接口防刷的功能,非常高大上,本文章仅供 ...
- Spring Boot项目的接口防刷
说明:使用了注解的方式进行对接口防刷的功能,非常高大上,本文章仅供参考 一,技术要点:springboot的基本知识,redis基本操作, 首先是写一个注解类: import java.lang.an ...
- 使用JWT设计SpringBoot项目api接口安全服务
转载直: 使用JWT设计SpringBoot项目api接口安全服务
- 使用Redis+自定义注解实现接口防刷
最近开发了一个功能,需要发送短信验证码鉴权,考虑到短信服务需要收费,因此对此接口做了防刷处理,实现方式主要是Redis+自定义注解(需要导入Redis的相关依赖,完成Redis的相关配置,gs代码,这 ...
- Spring Boot 项目的 API 接口防刷
首先是写一个注解类 拦截器中实现 注册到springboot中 在Controller中加入注解 说明:使用了注解的方式进行对接口防刷的功能,非常高大上,本文章仅供参考 一,技术要点:springbo ...
- springboot项目中接口入参的简单校验
.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...
- 页面接口防刷 解决思路一nginx
线上环境 很多接口 如果不做缓存 可能导致有人拿到url 每秒几万次的访问后台程序,导致系统down机. 此处, nginx可以加一层缓存. expires起到控制页面缓存的作用,合理的配置expi ...
- spring中实现基于注解实现动态的接口限流防刷
本文将介绍在spring项目中自定义注解,借助redis实现接口的限流 自定义注解类 import java.lang.annotation.ElementType; import java.lang ...
- docker安装部署、fastDFS文件服务器搭建与springboot项目接口
一.docker安装部署 1.更新yum包:sudo yum update 2.安装需要的软件包,yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动 ...
随机推荐
- JQuery DOM操作:设置内容&属性&添加元素&插入元素&包裹&克隆&移除&替换
JQuery text().html().val() $(elem).text(str):添加文本内容str到elem类型元素,返回jQuery对象 $(elem).text():返回第一个elem标 ...
- 19 JavaScript数组 &数组增删&最值&排序&迭代
关联数组(散列) 关联数组又叫做散列,即使用命名索引. JavaScript数组只支持数字索引. JavaScript对象使用命名索引,而数组使用数字索引,JavaScript数组是特殊类型的对象. ...
- 吴裕雄 python 神经网络——TensorFlow 数据集基本使用方法
import tempfile import tensorflow as tf input_data = [1, 2, 3, 5, 8] dataset = tf.data.Dataset.from_ ...
- Cisco Umbrella WLAN
Cisco Umbrella WLAN在域名系统(DNS)级别提供云交付网络安全服务,可自动检测已知和紧急威胁. 此功能允许您在实际恶意攻击之前阻止托管恶意软件,僵尸网络和网络钓鱼的站点. Cisco ...
- Python笔记⑤爬虫
爬虫的前奏 # 爬虫前奏 # 明确目的 # 找到数据对应的网页 # 分析网页的结果找到数据所在的标签位置 # 模拟HTTP请求,向服务器发送这个请求,获取到服务器返回给我们的HTML # 用正则表达式 ...
- SpringBoot启动使用elasticsearch启动异常:Received message from unsupported version:[2.0.0] minimal compatible
SpringBoot启动使用elasticsearch启动异常:Received message from unsupported version:[2.0.0] minimal compatible ...
- .NET Runtime at IP 791F7E06 (79140000) with exit code 80131506.
事件類型: 錯誤 事件來源: .NET Runtime 事件類別目錄: 無 事件識別碼: 1023 日期: 2015/12/15 時間: 上午 10:18:52 使用者: N/A 電腦: KM-ERP ...
- idea设置代码提示忽略大小写
- uniGUI之UniSyntaxEdit(24)
UniSyntaxEdit1语法高亮显示控件,主要属性Language,它是 多行 1]Language 语言 2]执行 FDquery1.Open(UniSyntaxEdit1.Lines.Tex ...
- python3.6.5修改print的颜色
开头部分:\033[显示方式;前景色;背景色m +想要输出的内容:\033[0m 注意:开头部分的三个参数:显示方式,前景色,背景色是可选参数,具体参数效果见下文,可以只写其中的某一个:参数 ...