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

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

3天内不再提示

一个注解搞定SpringBoot接口防刷

jf_ro2CN3Fa 来源:CSDN 2023-11-28 10:46 次阅读

一,技术要点:springboot的基本知识,redis基本操作,

首先是写一个注解类:

importjava.lang.annotation.Retention;
importjava.lang.annotation.Target;

importstaticjava.lang.annotation.ElementType.METHOD;
importstaticjava.lang.annotation.RetentionPolicy.RUNTIME;

/**
*@authoryhq
*@date2018/9/1015:52
*/

@Retention(RUNTIME)
@Target(METHOD)
public@interfaceAccessLimit{

intseconds();
intmaxCount();
booleanneedLogin()defaulttrue;
}

拦截器中实现:

importcom.alibaba.fastjson.JSON;
importcom.example.demo.action.AccessLimit;
importcom.example.demo.redis.RedisService;
importcom.example.demo.result.CodeMsg;
importcom.example.demo.result.Result;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Component;
importorg.springframework.web.method.HandlerMethod;
importorg.springframework.web.servlet.handler.HandlerInterceptorAdapter;

importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjava.io.OutputStream;

/**
*@authoryhq
*@date2018/9/1016:05
*/


@Component
publicclassFangshuaInterceptorextendsHandlerInterceptorAdapter{

@Autowired
privateRedisServiceredisService;

@Override
publicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{

//判断请求是否属于方法的请求
if(handlerinstanceofHandlerMethod){

HandlerMethodhm=(HandlerMethod)handler;

//获取方法中的注解,看是否有该注解
AccessLimitaccessLimit=hm.getMethodAnnotation(AccessLimit.class);
if(accessLimit==null){
returntrue;
}
intseconds=accessLimit.seconds();
intmaxCount=accessLimit.maxCount();
booleanlogin=accessLimit.needLogin();
Stringkey=request.getRequestURI();
//如果需要登录
if(login){
//获取登录的session进行判断
//.....
key+=""+"1";//这里假设用户是1,项目中是动态获取的userId
}

//从redis中获取用户访问的次数
AccessKeyak=AccessKey.withExpire(seconds);
Integercount=redisService.get(ak,key,Integer.class);
if(count==null){
//第一次访问
redisService.set(ak,key,1);
}elseif(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();
    }
}

注册到springboot中

importcom.example.demo.ExceptionHander.FangshuaInterceptor;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.web.servlet.config.annotation.InterceptorRegistry;
importorg.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
*@authoryhq
*@date2018/9/1015:58
*/
@Configuration
publicclassWebConfigextendsWebMvcConfigurerAdapter{

@Autowired
privateFangshuaInterceptorinterceptor;


@Override
publicvoidaddInterceptors(InterceptorRegistryregistry){
registry.addInterceptor(interceptor);
}
}

在Controller中加入注解

importcom.example.demo.result.Result;
importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.ResponseBody;

/**
*@authoryhq
*@date2018/9/1015:49
*/

@Controller
publicclassFangshuaController{

@AccessLimit(seconds=5,maxCount=5,needLogin=true)
@RequestMapping("/fangshua")
@ResponseBody
publicResultfangshua(){


returnResult.success("请求成功");

}








审核编辑:刘清

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

    关注

    19

    文章

    2956

    浏览量

    104531
  • Framework
    +关注

    关注

    0

    文章

    24

    浏览量

    8568

原文标题:一个注解搞定 SpringBoot 接口防刷,还有谁不会?

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Spring Boot的注解原理是什么

    @SpringBootApplication来看,发现@SpringBootApplication是组合注解。 @Target(ElementType.TYPE) @Retention
    的头像 发表于 08-27 09:24 2162次阅读

    教你如何用注解搞定Spring Boot接口

    ,技术要点: Spring Boot的基本知识,Redis基本操作,首先是写注解类: import java.lang.annotation.Retention; import
    的头像 发表于 09-13 09:23 1757次阅读

    Spring Boot常用注解与使用方式

    企业开发项目SpringBoot已经是必备框架了,其中注解是开发中的小工具(谁处可见哦),用好了开发效率大大提升,当然用错了也会引入缺陷。
    的头像 发表于 07-08 10:57 1337次阅读

    SpringBoot定时任务动态管理通用解决方案

    SpringBoot的定时任务的加强工具,实现对SpringBoot原生的定时任务进行动态管理,完全兼容原生@Scheduled注解,无需对原本的定时任务进行修改
    的头像 发表于 02-03 09:49 750次阅读

    无需注解SpringBoot API文档生成神器

    如果提交的表单是 application/x-www-form-urlencoded 类型的key/value格式,你可以在 SpringBoot 端通过在 @param 参数后添加字段解释或者在相关的JavaBean对象里面添加解释:
    的头像 发表于 03-13 09:38 894次阅读

    分享种优雅的接口处理方案

    通过在Interceptor中拦截请求,从Redis中统计用户访问接口次数从而达到接口目的
    的头像 发表于 03-29 14:56 725次阅读

    什么是 SpringBoot

    本文从为什么要有 `SpringBoot`,以及 `SpringBoot` 到底方便在哪里开始入手,逐步分析了 `SpringBoot` 自动装配的原理,最后手写了
    的头像 发表于 04-07 11:28 1262次阅读
    什么是 <b class='flag-5'>SpringBoot</b>?

    SpringBoot常用注解及使用方法1

    基于 SpringBoot 平台开发的项目数不胜数,与常规的基于`Spring`开发的项目最大的不同之处,SpringBoot 里面提供了大量的注解用于快速开发,而且非常简单,基本可以做到开箱即用! 那
    的头像 发表于 04-07 11:51 674次阅读

    SpringBoot常用注解及使用方法2

    基于 SpringBoot 平台开发的项目数不胜数,与常规的基于Spring开发的项目最大的不同之处,SpringBoot 里面提供了大量的注解用于快速开发,而且非常简单,基本可以做到开箱即用!
    的头像 发表于 04-07 11:52 640次阅读

    Springboot常用注解合集

    前几章,在系统启动类里面,都加入了此启动注解,此注解组合注解,包括了`@SpringBootConfiguration`、`@EnableAutoConfiguration`和`@
    的头像 发表于 04-07 14:27 705次阅读
    <b class='flag-5'>Springboot</b>常用<b class='flag-5'>注解</b>合集

    SpringBoot常用注解及原理

    SpringBootConfiguration继承自@Configuration,二者功能也致,标注当前类是配置类, 并会将当前类内声明的或多个以@Bean注解标记的方法的实例纳
    的头像 发表于 04-07 14:30 560次阅读

    SpringBoot的核心注解1

    今天跟大家来探讨下SpringBoot的核心注解@SpringBootApplication以及run方法,理解下springBoot为什么不需要XML,达到零配置
    的头像 发表于 04-07 14:34 668次阅读
    <b class='flag-5'>SpringBoot</b>的核心<b class='flag-5'>注解</b>1

    SpringBoot的核心注解2

    今天跟大家来探讨下SpringBoot的核心注解@SpringBootApplication以及run方法,理解下springBoot为什么不需要XML,达到零配置
    的头像 发表于 04-07 14:34 1925次阅读
    <b class='flag-5'>SpringBoot</b>的核心<b class='flag-5'>注解</b>2

    springboot核心注解

    Spring Boot 是基于 Spring 框架的开源框架,它可以帮助开发者快速构建、部署和运行独立的、生产级的 Spring 应用程序。Spring Boot 提供了系列核心注解,这些注解可以
    的头像 发表于 11-23 09:23 490次阅读

    SpringBoot核心注解由几个注解组成

    等。本文将详尽介绍这些核心注解。 @SpringBootApplication @SpringBootApplication 是复合注解,包含了 @Configuration、@
    的头像 发表于 12-03 15:09 701次阅读