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

    文章

    337

    浏览量

    14293
  • Boot
    +关注

    关注

    0

    文章

    149

    浏览量

    35746
  • 注解
    +关注

    关注

    0

    文章

    18

    浏览量

    2663
收藏 人收藏

    评论

    相关推荐

    开关电源辐射老是超?教你好方法搞定

    开关电源辐射老是超?教你好方法搞定它【样机介绍】我本次调试的样机主控IC为思睿达主推的成都启臣微的CR52168BSG,此IC内封了
    的头像 发表于 10-16 08:02 342次阅读
    开关电源辐射老是超?<b class='flag-5'>教你</b><b class='flag-5'>一</b><b class='flag-5'>个</b>好方法<b class='flag-5'>搞定</b>它

    Spring Cloud Gateway网关框架

    SpringCloud Gateway功能特征如下: (1) 基于Spring Framework 5, Project Reactor 和 Spring Boot 2.0 进行构建; (2) 动态路由:能够匹配任何请求属性;
    的头像 发表于 08-22 09:58 407次阅读
    <b class='flag-5'>Spring</b> Cloud Gateway网关框架

    SpingBoot的5扩展点,超级实用!

    我们在启动Spring Boot项目的时候,是执行这样方法来启动的
    的头像 发表于 02-22 11:28 418次阅读
    SpingBoot的5<b class='flag-5'>个</b>扩展点,超级实用!

    使用Spring Boot 3.2虚拟线程搭建静态文件服务器

    Spring Boot 3.2 于 2023 年 11 月大张旗鼓地发布,标志着 Java 开发领域的关键时刻。这突破性的版本引入了
    的头像 发表于 01-09 09:34 1066次阅读
    使用<b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 3.2虚拟线程搭建静态文件服务器

    Spring事务失效的十种常见场景

    Spring的声明式事务功能更是提供了极其方便的事务配置方式,配合Spring Boot的自动配置,大多数Spring Boot项目只需要在
    的头像 发表于 12-11 15:03 827次阅读

    何用BUCK电路简单实现可靠的负电源?

    何用BUCK电路简单实现可靠的负电源?
    的头像 发表于 12-05 15:12 744次阅读
    如<b class='flag-5'>何用</b>BUCK电路简单实现<b class='flag-5'>一</b><b class='flag-5'>个</b>可靠的负电源?

    dubbo和spring cloud区别

    Dubbo和Spring Cloud是两非常流行的微服务框架,各有自己的特点和优势。在本文中,我们将详细介绍Dubbo和Spring Cloud的区别。 1.架构设计: Dubbo是阿里巴巴开源
    的头像 发表于 12-04 14:47 1535次阅读

    如何在Spring Boot应用程序中整合ZXing库

    在数字化时代,二维码已经成为了信息交流的种常见方式。它们被广泛用于各种应用,从产品标签到活动传单,以及电子支付。本文将向您展示如何在Spring Boot应用程序中整合ZXing库,以创建和解析QR码。
    的头像 发表于 12-03 17:39 1045次阅读

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

    Spring Boot开源的 JavaEE 开发框架,它以简化 Spring 框架的配置与开发为目标,旨在让开发者能快速构建独立、生
    的头像 发表于 12-03 15:09 683次阅读

    springboot自动装配原理简述

    Spring Boot是针对Spring框架的种快速开发工具,它通过自动装配(Auto-Configuration)机制简化了Spring
    的头像 发表于 12-03 14:57 1685次阅读

    Spring Boot 3.2支持虚拟线程和原生镜像

    Spring Boot 3.2 前几日发布,让我们用 Java 21、GraalVM 和虚拟线程来尝试下。
    的头像 发表于 11-30 16:22 669次阅读

    注解搞定SpringBoot接口

    技术要点:springboot的基本知识,redis基本操作,
    的头像 发表于 11-28 10:46 380次阅读

    springboot核心注解

    Spring Boot 是基于 Spring 框架的开源框架,它可以帮助开发者快速构建、部署和运行独立的、生产级的 Spring 应用程序。Spri
    的头像 发表于 11-23 09:23 481次阅读

    spring分布式框架有哪些

    Spring分布式框架。 Spring Cloud Spring Cloud是基于Spring Boot的分布式开发工具包。它提供了多个子
    的头像 发表于 11-16 10:58 732次阅读

    Spring布能用来搭建基础架构吗

    Spring Boot用于简化 Spring 应用程序开发的框架,它利用 Spring
    的头像 发表于 11-16 10:56 358次阅读