方式一(全局过滤器):对所有请求
利用filter过滤器 每次请求时将token,请求路径+请求参数存入缓存中,设置过期时间,若同一个token,路径+参数相同,且未过期则是重复请求
@Resource(name = "stringRedisTemplate")
private ValueOperations<String, String> sops;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String url = exchange.getRequest().getURI().getPath();
String token = getToken(exchange.getRequest());
String redis_api_Limiting = sops.get(REDIS_KEY + token);
String value = url;
MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();
if (!queryParams.isEmpty()) {
value = value + JSON.toJSONString(queryParams);
}
if (StringUtils.isNotNull(redis_api_Limiting) && redis_api_Limiting.equals(value)) {
return setIdempotency(exchange, "请勿重复请求");
} else {
sops.set(REDIS_KEY + token, value, API_TIME_OUT, TimeUnit.MILLISECONDS);
}
return chain.filter(mutableExchange);
}
private Mono<Void> setIdempotency(ServerWebExchange exchange, String msg) {
ServerHttpResponse response = exchange.getResponse();
response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
response.setStatusCode(HttpStatus.OK);
return response.writeWith(Mono.fromSupplier(() -> {
DataBufferFactory bufferFactory = response.bufferFactory();
return bufferFactory.wrap(JSON.toJSONBytes(R.fail(500, msg)));
}));
}
方式二: 注解+面向切面编程 同上述类似 针对某些方法在需要进行接口重复请求时 添加注解