美文网首页程序员
一个注解搞定 SpringBoot 接口防刷,还有谁不会?

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

作者: 阿里高级码农 | 来源:发表于2021-02-01 14:08 被阅读0次

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

一,技术要点:springboot的基本知识,redis基本操作,

首先是写一个注解类:


接着就是在Interceptor拦截器中实现:

importcom.alibaba.fastjson.JSON;

importcom.example.demo.action.AccessLimit;

importcom.example.demo.redis.RedisService;

importcom.example.demo.result.CodeMsg;

importcom.example.demo.result.Result;

importorg.springframework.beans.factory.annotation.Autowired;

importorg.springframework.stereotype.Component;

importorg.springframework.web.method.HandlerMethod;

importorg.springframework.web.servlet.handler.HandlerInterceptorAdapter;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

importjava.io.OutputStream;

@Component

publicclassFangshuaInterceptorextendsHandlerInterceptorAdapter{

@Autowired

privateRedisService redisService;

@Override

publicbooleanpreHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throwsException{

//判断请求是否属于方法的请求

if(handlerinstanceofHandlerMethod){

HandlerMethod hm = (HandlerMethod) handler;

//获取方法中的注解,看是否有该注解

AccessLimit accessLimit = hm.getMethodAnnotation(AccessLimit.class);

if(accessLimit ==null){

returntrue;

}

intseconds = accessLimit.seconds();

intmaxCount = accessLimit.maxCount();

booleanlogin = 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);

}elseif(count < maxCount){

//加1

redisService.incr(ak,key);

}else{

//超出访问次数

render(response,CodeMsg.ACCESS_LIMIT_REACHED);//这里的CodeMsg是一个返回参数

returnfalse;

}

}

returntrue;

}

privatevoidrender(HttpServletResponse response, CodeMsg cm)throwsException{

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中

接着在Controller中加入注解

相关文章

网友评论

    本文标题:一个注解搞定 SpringBoot 接口防刷,还有谁不会?

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