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");
    }
}
相关推荐
尘觉几秒前
创作 1024 天|把热爱写成长期主义
数据库·1024程序员节
Java程序员威哥1 分钟前
Spring Boot 3.x 云原生终极适配:GraalVM 原生镜像构建 + Serverless 生产级部署(完整实战+最优模板)
java·开发语言·spring boot·后端·云原生·serverless·maven
黛玉晴雯子0013 分钟前
Kubernets-Helm&发布模式(持续更新)
java·开发语言
qq_12498707533 分钟前
基于微信小程序宠物服务系统(源码+论文+部署+安装)
java·spring boot·后端·微信小程序·小程序·毕业设计·宠物
一嘴一个橘子6 分钟前
springMvc 快速体验
java
毕设源码-朱学姐8 分钟前
【开题答辩全过程】以 基于SSM框架的药店管理系统的设计与开发为例,包含答辩的问题和答案
java
云边有个稻草人1 小时前
KingbaseES 数据库赋能:时序数据库国产化替代的硬实力范本
数据库·时序数据库·国产数据库·金仓·kingbasees sql
MC丶科7 小时前
【SpringBoot常见报错与解决方案】中文乱码?Spring Boot 统一解决前后端中文乱码问题(含 Postman 测试)!别再百度“加 UTF-8”了!
spring boot·后端·postman
今晚务必早点睡8 小时前
微服务改数据库密码后服务仍能访问?一次“看似异常、实则常见”的生产现象全解析
数据库·微服务·oracle
老师我太想进步了202610 小时前
cmd连接MySQL及相关查询
数据库·mysql