0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

教你如何用一個(gè)注解搞定Spring Boot接口防刷

Android編程精選 ? 來源:CSDN技術(shù)社區(qū) ? 作者:CS打贏你 ? 2021-09-13 09:23 ? 次閱讀

一,技術(shù)要點(diǎn):

Spring Boot的基本知識,Redis基本操作,首先是寫一個(gè)注解類:

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攔截器中實(shí)現(xiàn):

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;

@Componentpublic 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進(jìn)行判斷

//。。。。。

key+=“”+“1”; //這里假設(shè)用戶是1,項(xiàng)目中是動(dòng)態(tài)獲取的userId

}

//從redis中獲取用戶訪問的次數(shù)

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{

//超出訪問次數(shù)

render(response,CodeMsg.ACCESS_LIMIT_REACHED); //這里的CodeMsg是一個(gè)返回參數(shù)

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;

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

@Controllerpublic class FangshuaController {

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

@RequestMapping(“/fangshua”)

@ResponseBody

public Result《String》 fangshua(){

return Result.success(“請求成功”);

}

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    14353
  • Boot
    +關(guān)注

    關(guān)注

    0

    文章

    149

    瀏覽量

    35844
  • 注解
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    2683
收藏 人收藏

    評論

    相關(guān)推薦

    校園點(diǎn)餐訂餐外賣跑腿Java源碼

    創(chuàng)建個(gè)校園點(diǎn)餐訂餐外賣跑腿系統(tǒng)是個(gè)復(fù)雜的項(xiàng)目,涉及到前端、后端、數(shù)據(jù)庫設(shè)計(jì)等多個(gè)方面。在這里,我可以提供
    的頭像 發(fā)表于 12-24 14:55 ?121次閱讀
    校園點(diǎn)餐訂餐外賣跑腿Java源碼

    SSM開發(fā)環(huán)境的搭建教程 SSM與Spring Boot的區(qū)別

    SSM開發(fā)環(huán)境的搭建教程 SSM(Spring+SpringMVC+MyBatis)開發(fā)環(huán)境的搭建涉及多個(gè)步驟,以下是詳細(xì)的教程: 創(chuàng)建Maven項(xiàng)目 : 使用Maven工具創(chuàng)建個(gè)新的Maven
    的頭像 發(fā)表于 12-16 18:13 ?470次閱讀

    Spring 應(yīng)用合并之路(二):峰回路轉(zhuǎn),柳暗花明

    提醒下,決定拋開 Spring Boot 內(nèi)置的父子容器方案,完全自己實(shí)現(xiàn)父子容器。 如何加載 web 項(xiàng)目? 現(xiàn)在的難題只有個(gè):如何加載 web 項(xiàng)目?加載完成后,如何持續(xù)持有 w
    的頭像 發(fā)表于 12-12 11:22 ?750次閱讀

    Air780E模組LuatOS開發(fā)實(shí)戰(zhàn) —— 手把手教你搞定數(shù)據(jù)打包解包

    本文要說的是低功耗4G模組Air780E的LuatOS開發(fā)實(shí)戰(zhàn),我將手把手教你搞定數(shù)據(jù)打包解包。
    的頭像 發(fā)表于 12-03 11:17 ?177次閱讀
    Air780E模組LuatOS開發(fā)實(shí)戰(zhàn) —— 手把手<b class='flag-5'>教你</b><b class='flag-5'>搞定</b>數(shù)據(jù)打包解包

    Spring事務(wù)實(shí)現(xiàn)原理

    這些操作。 spring事務(wù)有編程式事務(wù)和聲明式事務(wù)兩種實(shí)現(xiàn)方式。編程式事務(wù)是通過編寫代碼來管理事務(wù)的提交、回滾、以及事務(wù)的邊界。這意味著開發(fā)者需要在代碼中顯式地調(diào)用事務(wù)的開始、提交和回滾。聲明式事務(wù)是通過配置來管理事務(wù),您可以使用注解或XML配置來
    的頭像 發(fā)表于 11-08 10:10 ?828次閱讀
    <b class='flag-5'>Spring</b>事務(wù)實(shí)現(xiàn)原理

    dubbo3.0 服務(wù)導(dǎo)入導(dǎo)出原理

    不管是服務(wù)導(dǎo)出還是服務(wù)引入,都發(fā)生在應(yīng)用啟動(dòng)過程中,比如:在啟動(dòng)類上加上 @EnableDubbo 時(shí),該注解上有個(gè) @DubboComponentScan 注解
    的頭像 發(fā)表于 11-04 15:01 ?152次閱讀
    dubbo3.0 服務(wù)導(dǎo)入導(dǎo)出原理

    開關(guān)電源輻射老是超?教你個(gè)好方法搞定

    開關(guān)電源輻射老是超?教你個(gè)好方法搞定它【樣機(jī)介紹】我本次調(diào)試的樣機(jī)主控IC為思睿達(dá)主推的成都啟臣微的CR52168BSG,此IC內(nèi)封了
    的頭像 發(fā)表于 10-16 08:02 ?654次閱讀
    開關(guān)電源輻射老是超?<b class='flag-5'>教你</b><b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>好方法<b class='flag-5'>搞定</b>它

    探索抖光電云臺(tái)無馬達(dá)驅(qū)動(dòng)方案的技術(shù)奧秘

    在當(dāng)今科技飛速發(fā)展的時(shí)代,抖光電云臺(tái)無馬達(dá)驅(qū)動(dòng)方案成為了眾多領(lǐng)域關(guān)注的焦點(diǎn)。這技術(shù)不僅在攝影、攝像領(lǐng)域大放異彩,還在工業(yè)檢測、安監(jiān)控等領(lǐng)域發(fā)揮著重要作用。接下來,讓我們
    的頭像 發(fā)表于 10-08 17:44 ?301次閱讀
    探索<b class='flag-5'>防</b>抖光電云臺(tái)無<b class='flag-5'>刷</b>馬達(dá)驅(qū)動(dòng)方案的技術(shù)奧秘

    Spring Cloud Gateway網(wǎng)關(guān)框架

    SpringCloud Gateway功能特征如下: (1) 基于Spring Framework 5, Project Reactor 和 Spring Boot 2.0 進(jìn)行構(gòu)建; (2) 動(dòng)態(tài)路由:能夠匹配任何請求屬性;
    的頭像 發(fā)表于 08-22 09:58 ?496次閱讀
    <b class='flag-5'>Spring</b> Cloud Gateway網(wǎng)關(guān)框架

    ?無?分鐘教你怎么選!

    電機(jī)是指通過電磁感應(yīng)定律實(shí)現(xiàn)電能轉(zhuǎn)換或傳遞的種電磁裝置,在工業(yè)生產(chǎn)中有著十分重要的地位。有電機(jī)與無刷電機(jī),都屬于常用電機(jī),其區(qū)別就在于結(jié)構(gòu)內(nèi)是否有碳刷,除此之外,兩者還有很大的不同。調(diào)速方式有
    的頭像 發(fā)表于 08-13 17:21 ?344次閱讀
    有<b class='flag-5'>刷</b>?無<b class='flag-5'>刷</b>?<b class='flag-5'>一</b>分鐘<b class='flag-5'>教你</b>怎么選!

    vue+spring boot人員定位系統(tǒng)源碼,實(shí)現(xiàn)實(shí)時(shí)定位、智慧調(diào)度、軌跡追蹤

    、機(jī)具、物料上定位標(biāo)簽回傳的位置信息數(shù)據(jù),采用多維定位模式,精確定位人、機(jī)具、物料的實(shí)時(shí)位置,實(shí)現(xiàn)實(shí)時(shí)定位、物料標(biāo)簽配置、智慧調(diào)度、軌跡追蹤、工時(shí)統(tǒng)計(jì)、區(qū)域物料統(tǒng)計(jì)、電子圍欄等應(yīng)用功能。 技術(shù)架構(gòu):java+ spring boot+ v
    的頭像 發(fā)表于 08-08 14:27 ?729次閱讀
    vue+<b class='flag-5'>spring</b> <b class='flag-5'>boot</b>人員定位系統(tǒng)源碼,實(shí)現(xiàn)實(shí)時(shí)定位、智慧調(diào)度、軌跡追蹤

    二級BOOT啟動(dòng)失敗的原因?

    套代碼,使用不同的編譯與入方式 1、make命令,編譯結(jié)果 eagle.flash.bin與eagle.irom0text.bin,入方式: 2、make BOOT=new
    發(fā)表于 07-18 06:04

    玩轉(zhuǎn)Spring狀態(tài)機(jī)

    說起Spring狀態(tài)機(jī),大家很容易聯(lián)想到這個(gè)狀態(tài)機(jī)和設(shè)計(jì)模式中狀態(tài)模式的區(qū)別是啥呢?沒錯(cuò),Spring狀態(tài)機(jī)就是狀態(tài)模式的種實(shí)現(xiàn),在介紹Spring狀態(tài)機(jī)之前,讓我們來看看設(shè)計(jì)模式中
    的頭像 發(fā)表于 06-25 14:21 ?960次閱讀
    玩轉(zhuǎn)<b class='flag-5'>Spring</b>狀態(tài)機(jī)

    SpingBoot的5個(gè)擴(kuò)展點(diǎn),超級實(shí)用!

    我們在啟動(dòng)Spring Boot項(xiàng)目的時(shí)候,是執(zhí)行這樣個(gè)方法來啟動(dòng)的
    的頭像 發(fā)表于 02-22 11:28 ?474次閱讀
    SpingBoot的5<b class='flag-5'>個(gè)</b>擴(kuò)展點(diǎn),超級實(shí)用!

    使用Spring Boot 3.2虛擬線程搭建靜態(tài)文件服務(wù)器

    Spring Boot 3.2 于 2023 年 11 月大張旗鼓地發(fā)布,標(biāo)志著 Java 開發(fā)領(lǐng)域的個(gè)關(guān)鍵時(shí)刻。這突破性的版本引入了
    的頭像 發(fā)表于 01-09 09:34 ?1130次閱讀
    使用<b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 3.2虛擬線程搭建靜態(tài)文件服務(wù)器