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");
    }
}
相关推荐
郑州吴彦祖7725 分钟前
【java】数据类型与变量以及操作符
java·intellij-idea
程序员大金6 分钟前
基于SpringBoot+Vue+MySQL的在线学习交流平台
java·vue.js·spring boot·后端·学习·mysql·intellij-idea
栀夏6139 分钟前
MongoDB 索引
数据库
吹老师个人app编程教学11 分钟前
阿里巴巴_java开发规范手册详解
java·开发语言
天上掉下来个程小白11 分钟前
Stream流的终结方法(一)
java·windows
qq_25183645713 分钟前
基于SpringBoot vue 医院病房信息管理系统设计与实现
vue.js·spring boot·后端
米饭是菜qy15 分钟前
MySql 事务
数据库·mysql
天上掉下来个程小白33 分钟前
请求响应-08.响应-案例
java·服务器·前端·springboot
大白_dev33 分钟前
数据校验的总结
java·开发语言
武昌库里写JAVA34 分钟前
Vue3常用API总结
数据结构·spring boot·算法·bootstrap·课程设计