一、接口重复请求拦截:
1.1、 顾名思义就是拦截当前接口不能在规定的时间内,多次请求进来。
1.2、而有人问:那不同的用户请求同一个接口,也要给别的用户给拦截掉吗?
答: 这是不可能的,那要这么解决呢,我们可以给每条进来的数据,都加上用户各自的唯一标示就可以解决不同的用户拦截了,进一步详细拦截,可以加上请求参数拦截。
1.3、实现思路:
redis + mysql 控制拦截
二、ip地址拦截:
2.1、获取用户请求进来的真实ip地址跟要拦截的ip集合对比,比对成功,拦截在服务器外面。
2.2、实现思路:
mysql
三、数据库设计:
接口地址拦截表:
CREATE TABLE `intercept_address` (
`id` varchar(255) NOT NULL,
`address` varchar(255) NOT NULL COMMENT '需要拦截的访问地址',
`time` bigint(26) DEFAULT NULL COMMENT '限制接口重复请求时间:单位为秒,为null时,不做限制',
`remark` varchar(124) DEFAULT NULL COMMENT '备注',
`create_time` datetime DEFAULT NULL COMMENT '添加时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ip拦截表:
CREATE TABLE `intercept_whitelists` (
`id` varchar(255) NOT NULL,
`ip_address` varchar(46) NOT NULL COMMENT '拦截的ip地址',
`remark` varchar(124) DEFAULT NULL COMMENT '备注',
`create_time` datetime DEFAULT NULL COMMENT '添加时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
intercept_address 表字段解释
address:接口地址
time:接口重复请求时间限制,为空时,说明不需要重复拦截功能
intercept_whitelists 表,需要配合intercept_address 表,一起使用。
代码实现:
新建一个拦截类,继承 HandlerInterceptorAdapter 拦截类
import com.alibaba.fastjson.JSON;
import com.szhg.engineering.entity.InterceptAddress;
import com.szhg.engineering.enums.ReturnCodeEnum;
import com.szhg.engineering.server.InterceptAddressServer;
import com.szhg.engineering.server.InterceptWhitelistsServer;
import com.szhg.engineering.utils.RequestUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* 拦截器实现类
* @Date: 2020/4/24 15:50
*/
@Slf4j
public class RequestInterceptor extends HandlerInterceptorAdapter {
@Autowired
private InterceptWhitelistsServer interceptWhitelistsServer;
@Autowired
private InterceptAddressServer interceptAddressServer;
/**
* 在方法被调用前执行在该方法中可以做类似校验的功能。如果返回true,则继续调用下一个拦截器。如果返回false,则中断执行,