在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

一,技術要點:

Spring Boot的基本知識,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;

@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進行判斷

//。。。。。

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

}

}

再把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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • spring
    +關注

    關注

    0

    文章

    340

    瀏覽量

    14343
  • Boot
    +關注

    關注

    0

    文章

    149

    瀏覽量

    35837
  • 注解
    +關注

    關注

    0

    文章

    18

    瀏覽量

    2674
收藏 人收藏

    評論

    相關推薦

    校園點餐訂餐外賣跑腿Java源碼

    創建校園點餐訂餐外賣跑腿系統是復雜的項目,涉及到前端、后端、數據庫設計等多個方面。在這里,我可以提供
    的頭像 發表于 12-24 14:55 ?97次閱讀
    校園點餐訂餐外賣跑腿Java源碼

    SSM開發環境的搭建教程 SSM與Spring Boot的區別

    SSM開發環境的搭建教程 SSM(Spring+SpringMVC+MyBatis)開發環境的搭建涉及多個步驟,以下是詳細的教程: 創建Maven項目 : 使用Maven工具創建新的Maven
    的頭像 發表于 12-16 18:13 ?448次閱讀

    Spring 應用合并之路(二):峰回路轉,柳暗花明

    提醒下,決定拋開 Spring Boot 內置的父子容器方案,完全自己實現父子容器。 如何加載 web 項目? 現在的難題只有:如何加載 web 項目?加載完成后,如何持續持有 w
    的頭像 發表于 12-12 11:22 ?728次閱讀

    Air780E模組LuatOS開發實戰 —— 手把手教你搞定數據打包解包

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

    Spring事務實現原理

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

    dubbo3.0 服務導入導出原理

    不管是服務導出還是服務引入,都發生在應用啟動過程中,比如:在啟動類上加上 @EnableDubbo 時,該注解上有 @DubboComponentScan 注解
    的頭像 發表于 11-04 15:01 ?145次閱讀
    dubbo3.0 服務導入導出原理

    開關電源輻射老是超?教你好方法搞定

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

    探索抖光電云臺無馬達驅動方案的技術奧秘

    在當今科技飛速發展的時代,抖光電云臺無馬達驅動方案成為了眾多領域關注的焦點。這技術不僅在攝影、攝像領域大放異彩,還在工業檢測、安監控等領域發揮著重要作用。接下來,讓我們
    的頭像 發表于 10-08 17:44 ?296次閱讀
    探索<b class='flag-5'>防</b>抖光電云臺無<b class='flag-5'>刷</b>馬達驅動方案的技術奧秘

    Spring Cloud Gateway網關框架

    SpringCloud Gateway功能特征如下: (1) 基于Spring Framework 5, Project Reactor 和 Spring Boot 2.0 進行構建; (2) 動態路由:能夠匹配任何請求屬性;
    的頭像 發表于 08-22 09:58 ?493次閱讀
    <b class='flag-5'>Spring</b> Cloud Gateway網關框架

    ?無?分鐘教你怎么選!

    電機是指通過電磁感應定律實現電能轉換或傳遞的種電磁裝置,在工業生產中有著十分重要的地位。有電機與無刷電機,都屬于常用電機,其區別就在于結構內是否有碳刷,除此之外,兩者還有很大的不同。調速方式有
    的頭像 發表于 08-13 17:21 ?333次閱讀
    有<b class='flag-5'>刷</b>?無<b class='flag-5'>刷</b>?<b class='flag-5'>一</b>分鐘<b class='flag-5'>教你</b>怎么選!

    vue+spring boot人員定位系統源碼,實現實時定位、智慧調度、軌跡追蹤

    、機具、物料上定位標簽回傳的位置信息數據,采用多維定位模式,精確定位人、機具、物料的實時位置,實現實時定位、物料標簽配置、智慧調度、軌跡追蹤、工時統計、區域物料統計、電子圍欄等應用功能。 技術架構:java+ spring boot+ v
    的頭像 發表于 08-08 14:27 ?698次閱讀
    vue+<b class='flag-5'>spring</b> <b class='flag-5'>boot</b>人員定位系統源碼,實現實時定位、智慧調度、軌跡追蹤

    二級BOOT啟動失敗的原因?

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

    玩轉Spring狀態機

    說起Spring狀態機,大家很容易聯想到這個狀態機和設計模式中狀態模式的區別是啥呢?沒錯,Spring狀態機就是狀態模式的種實現,在介紹Spring狀態機之前,讓我們來看看設計模式中
    的頭像 發表于 06-25 14:21 ?953次閱讀
    玩轉<b class='flag-5'>Spring</b>狀態機

    SpingBoot的5擴展點,超級實用!

    我們在啟動Spring Boot項目的時候,是執行這樣方法來啟動的
    的頭像 發表于 02-22 11:28 ?468次閱讀
    SpingBoot的5<b class='flag-5'>個</b>擴展點,超級實用!

    使用Spring Boot 3.2虛擬線程搭建靜態文件服務器

    Spring Boot 3.2 于 2023 年 11 月大張旗鼓地發布,標志著 Java 開發領域的關鍵時刻。這突破性的版本引入了
    的頭像 發表于 01-09 09:34 ?1126次閱讀
    使用<b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 3.2虛擬線程搭建靜態文件服務器
    主站蜘蛛池模板: 黄色网页在线观看| 成人三级网址| 天天摸日日添狠狠添婷婷| 一区二区三区中文字幕| 一区二区三区网站| 色狠狠综合| 久久精品夜色国产| 日日草天天干| 激情五月社区| 久久激情五月| 亚洲综合五月天| 久久国产高清字幕中文| 久色tv| 他也色在线| 亚洲手机看片| 国产大片黄在线观看| 夜色资源站www国产在线观看| 毛片网站在线| 黄色片不卡| 性欧美乱又伦| 在线播放免费观看| 亚洲视频一区在线| 亚洲www网站| a级黄色毛片三个搞一| 男人的视频网站| 欧美一区二区三区四区视频| 婷婷亚洲综合五月天小说在线| 日本一区二区三区欧美在线观看| 欧美一级高清片欧美国产欧美| 成人欧美一区二区三区黑人免费 | 欧美一级欧美一级高清| 天天玩天天操| 短篇禁伦小说| 丁香花在线影院观看在线播放| 免费啪啪网| 美女污污网站| 1024你懂的国产精品| 亚洲亚洲人成网站在线观看| 播放个毛片看看| 免费在线观看污视频| 国产午夜精品不卡片|