0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何解决Spring Boot接口防刷

Android编程精选 来源:CSDN博客 作者: CS打赢你 2021-09-13 09:19 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一,技术要点: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(“请求成功”);

}

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    9635

    浏览量

    157801
  • Sprint
    +关注

    关注

    0

    文章

    86

    浏览量

    15631

原文标题:一个注解搞定 Spring Boot 接口防刷

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    漆刷涂注意事项 如何避免气泡和流挂

    分享三漆刷涂实用注意事项,重点讲解如何有效避免气泡和流挂产生。包含表面准备、粘度控制、涂手法、环境要求等关键要点,帮助提升涂覆质量与产品可靠性。
    的头像 发表于 05-18 01:28 261次阅读
    三<b class='flag-5'>防</b>漆刷涂注意事项 如何避免气泡和流挂

    深度剖析U-Boot ADC Uclass:从架构到实战的全维度解析

    在嵌入式开发中,ADC(模数转换)是连接模拟世界与数字系统的关键桥梁,而 U-Boot 作为嵌入式领域的经典引导程序,其 ADC 子系统的设计堪称分层架构与通用化设计的典范。本文将从架构、流程
    的头像 发表于 04-26 07:08 166次阅读
    深度剖析U-<b class='flag-5'>Boot</b> ADC Uclass:从架构到实战的全维度解析

    [T2080] : 将 u-boot 移植到 Flash 时出错的原因?如何解决?

    我有一个 T2080 处理器卡并尝试从 eSPI 闪存启动。 Configured the board to boot from Hardcoded boot mode and through
    发表于 04-21 07:27

    Visionfive2 从闪存启动失败,如何解决这个错误?

    ]dwmci_s:响应超时。 [i]dwmci_s:响应超时。 [i]BOOT 失败,错误0xffffffff [i]--------------------------------------------------------------- 如何解决这个错误?
    发表于 03-25 06:07

    漆和 PCB 板 “疏离、起皮、脱层”,90% 不是漆本身差,而是界面张力 / 表面能不匹配。

    漆和 PCB 板 “疏离、起皮、脱层”,90% 不是漆本身差,而是界面张力 / 表面能不匹配。该如何自测如何解决?
    的头像 发表于 03-02 11:59 362次阅读
    三<b class='flag-5'>防</b>漆和 PCB 板 “疏离、起皮、脱层”,90% 不是漆本身差,而是界面张力 / 表面能不匹配。

    无法使用 0xfffffffd 启动如何解决?

    ;amp; QSPI both result in this err: Main section boot fail,use backup section,error 0xfffffffdAll
    发表于 02-27 06:10

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

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

    漆和三胶的区别

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

    漆工艺全流程解析:从涂覆到固化的关键控制点

    漆的防护效果不仅取决于材料,更依赖工艺精度。行业主流涂覆方式及控制要点如下:1.涂工艺适用场景:小批量、复杂结构线路板(如带散热片的模块);操作要点:使用天然纤维,避免金属刷毛划伤PCB
    的头像 发表于 12-29 18:13 760次阅读
    三<b class='flag-5'>防</b>漆工艺全流程解析:从涂覆到固化的关键控制点

    漆厚度行业标准

    电路板在投入生产前一般都会使用三漆喷涂或涂进行防护,而三漆的涂覆厚度影响着电路板的防护性能,同时也决定了电子设备的生产成本、安全可靠性等多方面因素。今天小编带大家一起深入探究PCB三
    的头像 发表于 12-18 15:15 1084次阅读
    三<b class='flag-5'>防</b>漆厚度行业标准

    深入理解 RK3506 U-Boot 重定位:从代码到原理

    在嵌入式系统中,U-Boot 作为引导加载程序,其启动流程的核心环节之一就是 重定位(Relocation) 。对于 RK3506 这类基于 ARM Cortex-A 架构的芯片,重定位的本质是将
    的头像 发表于 11-28 07:05 1125次阅读
    深入理解 RK3506 U-<b class='flag-5'>Boot</b> 重定位:从代码到原理

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

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

    有机硅三漆有多强?从赔120万到军工订单,凭的是什么?

    有机硅三漆的核心价值,从来不是 “得厚”,而是 “分子改得对”。
    的头像 发表于 09-27 14:57 1325次阅读
    有机硅三<b class='flag-5'>防</b>漆有多强?从赔120万到军工订单,凭的是什么?

    Spring拦截器:你的请求休想逃过我的五指山!

    Spring框架中,拦截器(Interceptor)是一种强大的机制,它允许开发者在请求处理的不同阶段插入自定义逻辑。WebApplicationContext作为Spring Web应用的上下文容器,为拦截器的配置和管理提供了基础支持。
    的头像 发表于 07-26 11:25 855次阅读
    <b class='flag-5'>Spring</b>拦截器:你的请求休想逃过我的五指山!

    漆的涂覆工艺

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