javascript
后端技术:一个注解解决 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;
?
@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;
?
@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,項目中是動態(tài)獲取的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;
@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;
?
@Controller
public?class?FangshuaController?{
?
????@AccessLimit(seconds=5,?maxCount=5,?needLogin=true)
????@RequestMapping("/fangshua")
????@ResponseBody
????public?Result?fangshua(){
?
?
????????return?Result.success("請求成功");
?
????}
IT技術分享社區(qū)
個人博客網站:https://programmerblog.xyz
文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識
總結
以上是生活随笔為你收集整理的后端技术:一个注解解决 SpringBoot 接口防刷的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: network怎么断点调试_Window
- 下一篇: 后端技术:Spring Boot 项目打