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");
    }
}
相关推荐
Elastic 中国社区官方博客8 分钟前
使用 NVIDIA cuVS 在 Elasticsearch 中实现 GPU 加速的向量索引:在 10 分钟内处理 1.38 亿个向量
大数据·数据库·elasticsearch·搜索引擎·全文检索·安全威胁分析
wangqiaowq13 分钟前
AST 安全求值
java·开发语言
我们从未走散19 分钟前
AI 生图平台如何避免资损:用“扣款与凭据同事务”构建三态账本
开发语言·数据库·php
Java_2017_csdn1 小时前
OFC、ERP、OMS、WMS、TMS 对比-详解
java
Shadow(⊙o⊙)1 小时前
MySQL复合查询
数据库·mysql
L·S·P6 小时前
25MB 管理 100+ 种数据库:开源轻量客户端 DBX 介绍与上手
数据库·mysql·开源·database·dbx
笃行3509 小时前
KingbaseES KSQL Developer 的连接管理、数据处理与对象管理
数据库
ha_lydms9 小时前
MaxCompute中加密与解密函数
大数据·数据库·数据仓库·hadoop·dataworks·maxcompute·odps
EatFan9 小时前
Spring Boot 4 落地观察:从 yudao-cloud、matecloud、JPower 看国产脚手架的升级路线与迁移清单
java·spring boot·后端·spring cloud·微服务·后端开发·jdk 21
Shadow(⊙o⊙)9 小时前
MySQL内置函数
数据库·mysql