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");
}
}