注解实现接口鉴权和防刷限制

注解实现接口鉴权和防刷限制

    • 步骤
      • 1. 自定义注解
      • 2. 自定义Interceptor
      • 3. 拦截器注入Springboot
      • 4. 使用

项目中需要对开放给第三方接口实现鉴权和防刷限制可以使用自定义注解和Interceptor来实现

步骤

1. 自定义注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AccessLimit {int seconds() default 1;int maxCount() default 1;boolean needLogin()default true;
}

2. 自定义Interceptor

@Component
public class InterfaceInterceptor implements HandlerInterceptor {@Autowiredprivate RedisTemplate<String,Integer> redisTemplate;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//是否方法请求if (handler instanceof HandlerMethod) {HandlerMethod hm = (HandlerMethod) handler;//方法上是否有注解AccessLimit methodAnnotation = hm.getMethodAnnotation(AccessLimit.class);if(methodAnnotation == null){return true;}int maxCount = methodAnnotation.maxCount();int seconds = methodAnnotation.seconds();//TODO 注入RedisTemplateboolean needLogin = methodAnnotation.needLogin();if(needLogin){//判断登陆,接口授权的秘钥String secertKey = request.getParameter("secertKey");if(StringUtils.hasText(secertKey)){//查询数据库判断return true;}else{render(response,"未登录");return false;}}String key = request.getRequestURI();//从redis中获取用户访问的次数Integer count = redisTemplate.opsForValue().get(key);if(count == null){//第一次访问redisTemplate.opsForValue().set(key,1);redisTemplate.expire(key,seconds, TimeUnit.SECONDS);}else if(count < maxCount){//加1redisTemplate.boundValueOps(key).increment();redisTemplate.expire(key,seconds, TimeUnit.SECONDS);}else{//超出访问次数render(response,"超出访问次数,请稍后重试"); //这里的CodeMsg是一个返回参数return false;}}return true;}private static void render(HttpServletResponse response,String str) throws IOException {response.setContentType("application/json;charset=UTF-8");OutputStream out = response.getOutputStream();out.write(str.getBytes(StandardCharsets.UTF_8));out.flush();out.close();}
}

3. 拦截器注入Springboot

@Configuration
@RequiredArgsConstructor
public class InterfaceConfig implements WebMvcConfigurer {private final InterfaceInterceptor interceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(interceptor);}
}

4. 使用

 @AccessLimit@RequestMapping("/save")public String save(User users) {return users.toString();}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/578583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 创建容器

1、创建MySQL 拉取镜像&#xff1a;docker pull mysql:5.7创建容器&#xff1a;docker run -d --name mysql57001 -p 3306:3306 -v D:\DockerImage\QhData\MySql57:/var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 mysql:5.7进入容器&#xff1a;docker exec -it mysql57001 bas…

深度学习框架TensorFlo

深度学习框架TensorFlow TensorFlow简介第一个TensorFlow应用TensorFlow APITensorFlow基础概念TensorFlow张量&#xff08;Tensor&#xff09;TensorFlow张量维度TensorFlow张量形状&#xff08;Shape&#xff09;TensorFlow张量数据类型&#xff08;Data Type&#xff09;Te…

北亚服务器数据恢复-服务器断电导致raid5故障的数据恢复案例

服务器数据恢复环境&#xff1a; 服务器有一组由12块硬盘组建的raid5阵列。 服务器故障&分析&#xff1a; 机房供电不稳导致服务器意外断电&#xff0c;工作人员重启服务器后发现服务器无法正常使用。 根据故障情况&#xff0c;北亚企安数据恢复工程师初步判断服务器故障原…

在Windows 10中,设置DNS的入口有三个,包括命令提示符

作为你互联网接入订阅的一部分,互联网服务提供商(ISP)还为本地网络提供必要的设置,包括域名系统(DNS)地址,以便访问你喜爱的网站、在线服务和下载文件。 唯一需要注意的是,ISP的DNS服务器通常不是私用的,比其他服务慢,有时也不可靠。然而,你可以随时使用来自第三方…

termux 配置和系统安装

1、termux 配置 去 termux官网 下载对应的 APK 并安装即可 Termux 是 Android 平台上的一个终端模拟器&#xff0c;它将众多 Linux 上运行的软件和工具近乎完美的移植到了手机端。 换源 由于 Termux 默认使用国外的镜像源&#xff0c;在国内访问国外服务器会很慢或者连接不上…

SQL数据工程师面试题20231226

1、数据库知识: 表一:Stock(商品库存入库表) 商品编号 入库数量 描述 A 300 A B 400 B C 200 C 注: Stock 表的商品编号是唯一主键。 表二: OutStock(商品库存出库表) 商品编号 出库数量 描述 A 100 A B 40 B B 50 B 注: outStock 表同一个商品存在多次出库。 – 创建 Stoc…

MyBatis见解4

10.MyBatis的动态SQL 10.5.trim标签 trim标签可以代替where标签、set标签 mapper //修改public void updateByUser2(User user);<update id"updateByUser2" parameterType"User">update user<!-- 增加SET前缀&#xff0c;忽略&#xff0c;后缀…

vue3学习之路

reactive, ref响应式数据 let num reactive(0)// reactive中是简单数据类型&#xff0c;不会自动响应到页面中&#xff0c;除非有对象类型要响应才会跟着响应到页面 const obj reactive({num: 0,name: malinshu })const add () > {num;obj.num;obj.name obj.name -- }…

WizFi360-EVB-Pico评估版介绍

文章目录 1 概述2 硬件资源2.1 硬件规格2.2 引脚定义2.3 工作条件 3 参考资料3.1 Datasheet3.2 原理图3.3 尺寸图(单位 : mm) 3.4 参考例程 1 概述 WizFi360-EVB-Pico基于树莓派RP2040&#xff0c;并使用WizFi360增加Wi-Fi连接。它与树莓派Pico板引脚兼容&#xff0c;可用于物联…

一个越南程序员的阿里巴巴之旅

译者 蒋辉文&#xff0c;公众号&#xff1a;ali老蒋 文章说明 本文访谈主人公是一个越南程序员&#xff0c;原来在 Lazada 工作。后来&#xff0c;Lazada 被阿里收购&#xff0c;他就来到阿里&#xff0c;在杭州阿里巴巴西溪园区呆过一段时间。现在&#xff0c;他已经跳槽到…

【MySQL】数据库规范化的三大法则 — 一探范式设计原则

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 数 据 库 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 1. 第一范式&#xff08;1NF&#xff09;&#xff1a; 2. 第二范式&#xff08;2NF&#xff09;&#xff1a; 3. 第三范式…

打字练习软件推荐:Master of Typing 3 中文 for Mac

"Master of Typing 3"是一款针对打字练习和提高打字速度的软件。它提供了一系列有趣和有挑战性的练习&#xff0c;旨在帮助用户提高键盘打字技能和准确性。 以下是"Master of Typing 3"的一些主要特点和功能&#xff1a; 打字练习&#xff1a;软件提供了各…

2023年12月25日学习总结——MLP

&#x1f4a1;我准备每一天都写一个学习总结&#xff0c;周末再把每日的学习总结汇总成专门的文章 &#x1f506;我的学习总结主要是为了自己的个人学习&#xff0c;没有商业用途&#xff0c;侵删 okkk开始今日学习 目录 1、今日计划学习内容2、今日学习内容深入学习MLP&#…

西南科技大学计算机网络实验四(交换机基本配置与VLAN配置)

一、实验目的 熟悉交换机的各种基本配置与VLAN配置。 二、实验环境 使用RouterSim Network Visualizer软件来模拟网络设备与网络环境。 三、实验内容 1、交换机的基础配置 2、单台交换机上的简单VLAN设置 3、多台交换机上进行VLAN设置 四、实验步骤 4.1 交换机的基础配置…

6.3 多线程的安全与应用

6.3 多线程的安全与应用 1. 多线程概念1. 进程2. 线程 2. 创建多线程3. 线程同步4. 线程安全5. 线程池应用 1. 多线程概念 1. 进程 2. 线程 2. 创建多线程 3. 线程同步 4. 线程安全 5. 线程池应用

编写fastapi接口服务

FastAPI是一个基于 Python 的后端框架&#xff0c;该框架鼓励使用 Pydantic 和 OpenAPI (以前称为 Swagger) 进行文档编制&#xff0c;使用 Docker 进行快速开发和部署以及基于 Starlette 框架进行的简单测试。 step1&#xff1a;安装必要库 pip install fastapi uvicorn st…

设计模式--建造者模式

实验5&#xff1a;建造者模式 本次实验属于模仿型实验&#xff0c;通过本次实验学生将掌握以下内容&#xff1a; 1、理解建造者模式的动机&#xff0c;掌握该模式的结构&#xff1b; 2、能够利用建造者模式解决实际问题。 [实验任务]&#xff1a;计算机组装 使用建造者模…

MySQL explain执行计划详解

使用explain关键字可以模拟优化器执行SQL查询语句&#xff0c;从而知道MySQL是如何处理你的SQL语句的&#xff0c;分析你的查询语句或是表结构的性能瓶颈。 explain执行计划包含的信息 其中最重要的字段为&#xff1a;id、type、key、rows、Extra 各字段详解 id select查询…

C语言第五十八弹----介绍memset内存函数

介绍C语言内存函数memset memset是C语言标准库中的一个函数&#xff0c;用于将一块内存区域的数据设置为指定的值。 源代码 void* memset(void* ptr, int value, size_t num);ptr是指向要设置的内存区域的指针&#xff0c;value是要设置的值&#xff08;以int形式表示&#x…

每日一练2023.12.25——验证身份【PTA】

题目链接 &#xff1a;验证身份 题目要求&#xff1a; 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下&#xff1a; 首先对前17位数字加权求和&#xff0c;权重分配为&#xff1a;{7&#xff0c;9&#xff0c;10&#xff0c;5&a…