SpringBoot 接口防刷

1:pom添加依赖

XML 复制代码
  <dependency>
      <groupId>net.jodah</groupId>
         <artifactId>expiringmap</artifactId>
      <version>0.5.10</version>
   </dependency>

2:封装工具

java 复制代码
@Slf4j
public class RequestUtil {



    /**
     * 1)ExpirationPolicy.ACCESSED :每进行一次访问,过期时间就会自动清零,重新计算;
     * 2)ExpirationPolicy.CREATED:在过期时间内重新 put 值的话,过期时间会清理,重新计算;
     */
    private final static ExpiringMap<String, String> EXP_TIME_MAP = ExpiringMap.builder()
            // 设置每个key有效时间5s, 如果key不设置过期时间,key永久有效
            .expiration(5, TimeUnit.SECONDS)
            // 允许更新过期时间值
            .variableExpiration()
            // CREATED: 只在put和replace方法重置过期时间
            .expirationPolicy(ExpirationPolicy.CREATED).build();

    /**
     * @param
     * @Description 判断在固定时间内是否重复请求
     * @Throws
     * @Return boolean
     * @Date 2024-03-04 17:26:38
     * @Author WangKun
     */
    public static boolean isRepeatSubmitInterceptor(HttpServletRequest request, HttpServletResponse response) {
        //获取用户访问地址
        String uri = request.getRequestURI();
        String ip = IPUtil.getIpAddr(request);
        if (uri.equals(EXP_TIME_MAP.get(ip))) {
            return true;
        }
        EXP_TIME_MAP.put(ip, uri);
        return false;
    }

}

3:调用(springboot拦截)

java 复制代码
/**
 * @Description 拦截器
 * @Author WangKun
 * @Date 2023/3/6 10:16
 * @Version
 */
@Slf4j
public class UrlInterceptor implements HandlerInterceptor {

    /**
     * @param request
     * @param response
     * @param handler
     * @Description 调用时间:Controller方法处理之前
     * 执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行
     * 若返回false,则中断执行,注意:不会进入afterCompletion
     * @Throws
     * @Return boolean
     * @Date 2023-04-21 10:19:32
     * @Author WangKun
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {

        //在这里调用

        return true;
    }

    /**
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @Description 调用前提:preHandle返回true
     * 调用时间:DispatcherServlet进行视图的渲染之后
     * 多用于清理资源
     * @Throws
     * @Return void
     * @Date 2023-04-21 10:19:53
     * @Author WangKun
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {

    }


}

拦截器配置

java 复制代码
/**
 * @Description 拦截器配置
 * @Author WangKun
 * @Date 2023/3/6 10:33
 * @Version
 */
@Configuration
public class WebInterceptorConfig implements WebMvcConfigurer {

    /**
     * @param registry
     * @Description 跨域
     * @Throws
     * @Return void
     * @Date 2023-04-21 10:34:12
     * @Author WangKun
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        //设置允许跨域的路径
        registry.addMapping("/**")
                //设置允许跨域请求的域名 2.0版本使用allowedOrigins 2.4版本以上使用allowedOriginPatterns
                .allowedOriginPatterns("*")
                //是否允许证书 不再默认开启
                .allowCredentials(true)
                //设置允许的方法
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE")
                // 所有请求头
                .allowedHeaders("*")
                //跨域允许时间
                .maxAge(3600);
    }

    /**
     * @param registry
     * @Description 拦截放行配置
     * @Throws
     * @Return void
     * @Date 2023-04-21 10:33:51
     * @Author WangKun
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //添加拦截器
        registry.addInterceptor(new UrlInterceptor())
                //拦截所有路径
                .addPathPatterns("/**");
                //放行路径,可以添加多个
//                .excludePathPatterns("/api/login");
    }
}
相关推荐
凉年技术1 分钟前
Java 实现企业微信扫码登录
java·企业微信
爱可生开源社区10 分钟前
某马来西亚游戏公司如何从 SQL Server 迁移至 OceanBase?
数据库
七牛云行业应用14 分钟前
保姆级 OpenClaw 避坑指南:手把手教你看日志修 Bug,顺畅连通各大 AI 模型
人工智能·后端·node.js
程序员爱钓鱼21 分钟前
Go并发控制核心:context 包完整技术解析
后端·google·go
树獭叔叔22 分钟前
OpenClaw Plugins 与 Hooks 系统:让 AI 助手无限可能
后端·aigc·openai
FE_winter27 分钟前
OpenClaw Skills 进阶实战:前端开发者的 AI 技能库搭建指南
前端·后端·程序员
Java编程爱好者40 分钟前
用Spring的ApplicationEventPublisher进行事件发布和监听
后端
Java编程爱好者43 分钟前
MySQL索引优化实战:从原理到调优
后端
梁大虎1 小时前
Electrobun 开发必看:CEF 依赖下载失败?手动解压一招搞定!
前端·javascript·后端
狂奔小菜鸡1 小时前
Day41 | Java中的锁分类
java·后端·java ee