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

    文章

    345

    浏览量

    16088
  • Boot
    +关注

    关注

    0

    文章

    154

    浏览量

    37977
  • 注解
    +关注

    关注

    0

    文章

    18

    浏览量

    2862
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    搞定 BLDC 开发!笙泉MDF101A无马达控制开发板(EVB)全解析

    搞定 BLDC 开发!笙泉MDF101A无马达控制开发板(EVB)全解析 32位BLDC EVB: MDF系列 、从FOC到方波、从有感到无感,快速完成马达控制验证 M
    发表于 05-19 09:59

    告别手忙脚乱!蜀瑞创新语音键顺控,句话搞定开关柜

    语音键顺控,不是简单加个语音功能,而是可视化 + 语音 + 五 + 自动顺控的体化升级 —— 让开关柜 “听得懂、做得准、看得见”,把电力运维从 “繁琐人工” 推向 “智能语音” 时代。
    的头像 发表于 04-24 09:16 352次阅读
    告别手忙脚乱!蜀瑞创新语音<b class='flag-5'>一</b>键顺控,<b class='flag-5'>一</b>句话<b class='flag-5'>搞定</b>开关柜

    13 万转无吸尘器 PCBA 方案参数虚标?其利天下教你现场实测 3 关键指标

    深圳其利天下技术开发有限公司,以自研高端芯片系列 KY32DS024为核心,打造其利天下 13 万转无吸尘器 PCBA 方案,坚持全参数实标、拒绝虚假宣传。针对行业虚标乱象,本文教你现场实测 3 核心指标,
    的头像 发表于 04-11 14:00 209次阅读
    13 万转无<b class='flag-5'>刷</b>吸尘器 PCBA 方案参数虚标?其利天下<b class='flag-5'>教你</b>现场实测 3 <b class='flag-5'>个</b>关键指标

    瑞芯微RKNPU开发全指南:从环境搭建到性能优化,搞定边缘AI部署

    的轻量化 NPU,都需要通过RKNN SDK实现模型部署。今天这篇文章,我们就从 SDK 核心组件、开发全流程、进阶优化到避坑指南,手把手教你搞定 RKNPU 开发!
    的头像 发表于 02-06 16:35 4392次阅读
    瑞芯微RKNPU开发全指南:从环境搭建到性能优化,<b class='flag-5'>一</b>文<b class='flag-5'>搞定</b>边缘AI部署

    Linux进程管理不用愁!这6工具帮你搞定90%场景

    在 Linux 系统中,进程是资源分配的基本单位,无论是服务器运维、程序调试还是日常使用,掌握进程管理工具都是必备技能。今天就带大家梳理 6 最常用的进程管理工具,从查看进程到控制进程,篇文章全搞定
    的头像 发表于 02-04 16:23 3406次阅读
    Linux进程管理不用愁!这6<b class='flag-5'>个</b>工具帮你<b class='flag-5'>搞定</b>90%场景

    解析Rockchip平台U-Boot核心文件:boot_rkimg.c到底做了什么?

    在嵌入式开发中,U-Boot 作为引导程序的 “中流砥柱”,负责初始化硬件、加载内核并启动系统。对于 Rockchip 平台的设备(如常见的开发板、智能终端),boot_rkimg.c 是 U-Boot 中专门处理启动流程的核心
    的头像 发表于 02-03 15:29 1051次阅读
    解析Rockchip平台U-<b class='flag-5'>Boot</b>核心文件:<b class='flag-5'>boot</b>_rkimg.c到底做了什么?

    漆和三胶的区别

    最合适的选择?今天小编将为您清晰梳理它们两者的核心区别与应用场景。三漆和三胶的区别物理形态与成膜特性差异三漆通常是种粘度较低的液态涂料。它通过喷涂、
    的头像 发表于 01-19 17:08 662次阅读
    三<b class='flag-5'>防</b>漆和三<b class='flag-5'>防</b>胶的区别

    最新版ESP-IDF 全离线安装,收藏这一个就够了

    还在为ESP-IDF开发环境搭建发愁?不要慌!本期我们教你新手也能100%成功的全离线安装方法!编译、烧录、验证文带你搞定!本教程所用
    的头像 发表于 01-14 18:05 3410次阅读
    最新版ESP-IDF 全离线安装,收藏这<b class='flag-5'>一个</b>就够了

    合科泰教你如何焊接简单LED闪烁电路

    你是否曾好奇那些闪烁的LED灯背后的原理?今天教你用5分钟焊接简单的LED闪烁电路,无需编程,只需把电烙铁、几个简单元件和基础的焊接技能,就能打造属于自己的电子小玩具。 这不仅能
    的头像 发表于 01-07 17:28 1428次阅读
    合科泰<b class='flag-5'>教你</b>如何焊接简单LED闪烁电路

    漆应用失败?八常见问题与解决方案搞定 | 东莞 铬锐特实业

    东莞三漆|铬锐特实业官网 | 三漆涂覆失败怎么办?本文总结8最常见问题(如起泡、不均匀、发白、附着力差等)及实用解决方案,文帮您避开三
    的头像 发表于 12-24 00:36 798次阅读
    三<b class='flag-5'>防</b>漆应用失败?八<b class='flag-5'>个</b>常见问题与解决方案<b class='flag-5'>一</b>文<b class='flag-5'>搞定</b> | 东莞 铬锐特实业

    款基于Java+Spring Boot+Vue的智慧随访管理系统源码

    智慧随访管理系统源码,款基于Java+Spring Boot+Vue的B/S架构医院随访管理系统源码,采用前后端分离技术(Ant-Design+MySQL5),具有自主版权和落地案例。 随访管理
    的头像 发表于 11-13 15:38 593次阅读
    <b class='flag-5'>一</b>款基于Java+<b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>+Vue的智慧随访管理系统源码

    ETHERCAT从站转PROFINET,网关全搞定

    ETHERCAT从站转PROFINET,网关全搞定 在矿山深处,套崭新的自动化系统正悄然改变着设备保护的格局。面对井下复杂的工况和多品牌控制设备共存的现状,我们设计的这套保护系统
    的头像 发表于 10-22 10:03 466次阅读
    ETHERCAT从站转PROFINET,<b class='flag-5'>一</b><b class='flag-5'>个</b>网关全<b class='flag-5'>搞定</b>

    漆的涂覆工艺

    漆作为电子线路板的核心防护材料,通过形成透明保护膜实现防潮、盐雾、防霉功能。本文将梳理涂、浸涂、喷涂、选择性涂覆四大三漆涂覆主流工艺的技术特点、工艺参数及质量控制要点。1.
    的头像 发表于 07-24 15:55 1656次阅读
    三<b class='flag-5'>防</b>漆的涂覆工艺

    明治案例 | 150/分钟!电阻【OCR识别】+【尺寸测量】步到位

    真实案例——看明治传感如何用视觉传感器,同时搞定电阻的尺寸测量和OCR识别,让质检效率翻倍,成本直降!场景需求希望在同工位完成尺寸测量
    的头像 发表于 06-10 07:33 960次阅读
    明治案例 | 150<b class='flag-5'>个</b>/分钟!电阻【OCR识别】+【尺寸测量】<b class='flag-5'>一</b>步到位

    手把手教你用RadiMation进行MIMO功率测量,轻松搞定射频测试!

    MIMO设备功率测量太复杂?TS-RadiMation帮你搞定!本文详细解析MIMO功率测量全流程,从配置到数据分析,助你快速掌握关键测试技巧,提升测试效率!
    的头像 发表于 05-26 17:42 909次阅读
    手把手<b class='flag-5'>教你</b>用RadiMation进行MIMO功率测量,轻松<b class='flag-5'>搞定</b>射频测试!