美文网首页程序员java 设计
Springboot项目的接口防刷

Springboot项目的接口防刷

作者: JAVA伯乐 | 来源:发表于2019-03-23 16:29 被阅读3次

说明:使用了注解的方式进行对接口防刷的功能,非常高大上,本文章仅供参考

一,技术要点: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;

@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;

@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();

   }

}

注册到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;

@Configuration

public class WebConfig extends WebMvcConfigurerAdapter {

   @Autowired

   private FangshuaInterceptor interceptor;

   @Override

   public void addInterceptors(InterceptorRegistry registry) {

       registry.addInterceptor(interceptor);

   }

}

在Controller中加入注解

最后,给大家推荐一个Java进阶交流群851531810,不管你在地球哪个方位,不管你参加工作几年都欢迎你的入驻!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!)

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;

@Controller

public class FangshuaController {

   @AccessLimit(seconds=5, maxCount=5, needLogin=true)

   @RequestMapping("/fangshua")

   @ResponseBody

   public Result<String&gt; fangshua(){

       return Result.success("请求成功");

}

相关文章

  • Springboot项目的接口防刷

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

  • Springboot项目的接口防刷(实例)

    技术要点:springboot的基本知识,redis基本操作, 首先是写一个注解类: 接着就是在Intercept...

  • 牛X!一个注解搞定接口防刷!

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

  • 一个注解搞定 SpringBoot 接口防刷,还有谁不会?

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

  • 接口限流防刷

    思路:将访问次数放入缓存,key为URI+User ID 将这个通用方法,使用拦截器改造。 1.将目标方法加上注解...

  • API接口防刷

    访问的时候记录用户IP写到redis中,ip为key,值为1,有效期一个小时;每访问一次就给这个IP+1,加到10...

  • 接口如何防刷

    问题 接口如何防刷 好多厂子都会问你这个问题,基本上大多数处理方式都是后端工程师对用户的接口调用次数做限制,其实可...

  • API 接口防刷

    API 接口防刷 顾名思义,想让某个接口某个人在某段时间内只能请求N次。在项目中比较常见的问题也有,那就是连点按钮...

  • 【Springboot之切面编程】注解实现接口防刷

    本文介绍一种极简洁、灵活通用接口防刷实现方式、通过在需要防刷的方法加上@Prevent 注解即可实现短信防刷;使用...

  • 怎么控制接口防刷

    昨天接到的需求,需要导致恶心刷接口,目前想到的方案如下 1.表记录更新时间,每次操作库的时候,比较一下库的时间...

网友评论

    本文标题:Springboot项目的接口防刷

    本文链接:https://www.haomeiwen.com/subject/svmsvqtx.html