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");
    }
}
相关推荐
Nnnnnnn几秒前
Kafka 踩坑实录:在 WSL2 环境下,容器死活连不上集群怎么办?
后端
lazy H2 分钟前
【计算机网络】第 13 篇:NAT 和端口映射是什么?为什么本地服务外网访问不了?
java·网络·网络协议·学习·计算机网络·408
就像楞次定律11 分钟前
【Linux 学习记之二】C++ 构建体系与底层链接机制的深度透视(1)
linux·后端
学到老活到老13 分钟前
第 22 集:Filter、Interceptor、AOP 都能拦截,为什么不能互换?
java·后端·spring
TDengine (老段)34 分钟前
TDengine IDMP 十大实用功能(3)
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
sun032238 分钟前
【JDK 动态代理】 和 【CGLIB 代理】对比
java·数据库·sql
文丑颜不良啊38 分钟前
LeetCode1261~1280题目解析
java·leetcode
郭小李40 分钟前
spring 中的 @EnableWebMvc注解和WebMvcConfigurer接口
java·后端·spring
卷无止境1 小时前
Skill 的安全边界在哪里:风险来源、验证思路与用户可用的防线
后端·python