日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

后端技术:一个注解解决 SpringBoot 接口防刷

發(fā)布時間:2023/12/10 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 后端技术:一个注解解决 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 接口防刷的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。