一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

如何解決Spring Boot接口防刷

Android編程精選 ? 來(lái)源:CSDN博客 ? 作者: CS打贏你 ? 2021-09-13 09:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一,技術(shù)要點(diǎn):Spring Boot的基本知識(shí),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 {

//判斷請(qǐng)求是否屬于方法的請(qǐng)求

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中獲取用戶訪問(wèn)的次數(shù)

AccessKey ak = AccessKey.withExpire(seconds);

Integer count = redisService.get(ak,key,Integer.class);

if(count == null){

//第一次訪問(wèn)

redisService.set(ak,key,1);

}else if(count 《 maxCount){

//加1

redisService.incr(ak,key);

}else{

//超出訪問(wèn)次數(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注冊(cè)到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(“請(qǐng)求成功”);

}

責(zé)任編輯:haq

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

    關(guān)注

    33

    文章

    9005

    瀏覽量

    153778
  • Sprint
    +關(guān)注

    關(guān)注

    0

    文章

    86

    瀏覽量

    15381

原文標(biāo)題:一個(gè)注解搞定 Spring Boot 接口防刷

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

    創(chuàng)建一個(gè)校園點(diǎn)餐訂餐外賣跑腿系統(tǒng)是一個(gè)復(fù)雜的項(xiàng)目,涉及到前端、后端、數(shù)據(jù)庫(kù)設(shè)計(jì)等多個(gè)方面。在這里,我可以提供一個(gè)簡(jiǎn)化的Java后端示例,使用Spring Boot框架來(lái)搭建一個(gè)基本的API服務(wù)。這個(gè)
    的頭像 發(fā)表于 12-24 14:55 ?607次閱讀
    校園點(diǎn)餐訂餐外賣跑腿Java源碼

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

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

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

    提醒下,決定拋開(kāi) Spring Boot 內(nèi)置的父子容器方案,完全自己實(shí)現(xiàn)父子容器。 如何加載 web 項(xiàng)目? 現(xiàn)在的難題只有一個(gè):如何加載 web 項(xiàng)目?加載完成后,如何持續(xù)持有 web 項(xiàng)目?經(jīng)過(guò)思考后,可以創(chuàng)建一個(gè) boot
    的頭像 發(fā)表于 12-12 11:22 ?1128次閱讀

    實(shí)用的倒灌電路,倒灌問(wèn)題如何解

    首先,什么是串口倒灌電路。簡(jiǎn)單來(lái)說(shuō),它就是防止電流從一個(gè)器件倒灌到另一個(gè)器件,保護(hù)系統(tǒng)穩(wěn)定性和安全性。 假如有兩個(gè)芯片之間通過(guò)串口通信,二者電源都被使能,都在正常工作,沒(méi)有異常。 但是,如果IC2
    的頭像 發(fā)表于 11-20 10:15 ?2639次閱讀
    實(shí)用的<b class='flag-5'>防</b>倒灌電路,倒灌問(wèn)題如<b class='flag-5'>何解</b>決

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

    作者:京東零售 范錫軍 1、引言 springspring-tx模塊提供了對(duì)事務(wù)管理支持,使用spring事務(wù)可以讓我們從復(fù)雜的事務(wù)處理中得到解脫,無(wú)需要去處理獲得連接、關(guān)閉連接、事務(wù)提交和回滾等
    的頭像 發(fā)表于 11-08 10:10 ?1158次閱讀
    <b class='flag-5'>Spring</b>事務(wù)實(shí)現(xiàn)原理

    ti814x-ddr3-init-u-boot

    電子發(fā)燒友網(wǎng)站提供《ti814x-ddr3-init-u-boot.pdf》資料免費(fèi)下載
    發(fā)表于 10-12 10:38 ?0次下載
    ti814x-ddr3-init-u-<b class='flag-5'>boot</b>

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

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

    OMAP-L138_Flash And Boot Utils使用及編譯指導(dǎo)

    電子發(fā)燒友網(wǎng)站提供《OMAP-L138_Flash And Boot Utils使用及編譯指導(dǎo).pdf》資料免費(fèi)下載
    發(fā)表于 09-05 11:26 ?0次下載
    OMAP-L138_Flash And <b class='flag-5'>Boot</b> Utils使用及編譯指導(dǎo)

    何解決工字電感噪音大的問(wèn)題

    電子發(fā)燒友網(wǎng)站提供《如何解決工字電感噪音大的問(wèn)題.docx》資料免費(fèi)下載
    發(fā)表于 09-04 11:46 ?0次下載

    何解決電感的漏感問(wèn)題

    電子發(fā)燒友網(wǎng)站提供《如何解決電感的漏感問(wèn)題.docx》資料免費(fèi)下載
    發(fā)表于 09-02 14:48 ?0次下載

    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)路由:能夠匹配任何請(qǐng)求屬性;
    的頭像 發(fā)表于 08-22 09:58 ?734次閱讀
    <b class='flag-5'>Spring</b> Cloud Gateway網(wǎng)關(guān)框架

    單片機(jī)boot0和boot1怎么設(shè)置

    單片機(jī)Boot0和Boot1簡(jiǎn)介 Boot0和Boot1是單片機(jī)啟動(dòng)模式選擇引腳,用于選擇單片機(jī)的啟動(dòng)模式。 Boot0和
    的頭像 發(fā)表于 08-22 09:50 ?5798次閱讀

    stm32讀取boot引腳狀態(tài)

    在STM32微控制器中,Boot引腳(通常指的是BOOT0和BOOT1引腳)的狀態(tài)決定了設(shè)備啟動(dòng)時(shí)的引導(dǎo)模式。這些引腳的狀態(tài)在復(fù)位時(shí)被讀取,并據(jù)此選擇啟動(dòng)哪塊存儲(chǔ)器。比如,STM32F103系列
    的頭像 發(fā)表于 08-22 09:48 ?2809次閱讀

    STM32引腳中的BOOT1在哪里

    STM32是STMicroelectronics(意法半導(dǎo)體)推出的一系列32位微控制器,廣泛應(yīng)用于嵌入式系統(tǒng)設(shè)計(jì)。關(guān)于STM32的BOOT1引腳,它主要與系統(tǒng)的啟動(dòng)模式有關(guān)。 BOOT1引腳功能
    的頭像 發(fā)表于 08-22 09:43 ?4900次閱讀

    stm32boot0和boot1對(duì)應(yīng)哪個(gè)p引腳

    STM32系列微控制器是一種廣泛應(yīng)用于嵌入式系統(tǒng)領(lǐng)域的32位微控制器。在STM32系列微控制器中,BOOT0和BOOT1是兩個(gè)重要的引腳,它們用于設(shè)置設(shè)備的啟動(dòng)模式。 首先,讓我們了解STM32系列
    的頭像 發(fā)表于 08-22 09:40 ?6327次閱讀