spring boot拦截器实现IP黑名单实例代码
发布时间 - 2026-01-11 00:51:08 点击率:次前言

最近一直在搞 Hexo+GithubPage 搭建个人博客,所以没怎么进行 SpringBoot 的学习。所以今天就将上次的”?秒防刷新”进行了一番修改。上次是采用注解加拦截器(@Aspect)来实现功能的。但是,如果需求是一个全局的拦截器对于大部分URL都进行拦截的话,自己一个个加显然是不可能的。而且上次的拦截器对于Controller的参数有所要求,在实际他人引用总是显得不方便。所以,这次使用了继承HandlerInterceptor来实现拦截器。
功能需求
对于项目中某类URL进行拦截,若用户在短时间内大量访问该链接,则将用户IP列入黑名单,禁止用户访问网页。(同时,可以使用@Async来创建定时任务帮用户解禁。)
知识记录
spring 的拦截器 HandlerInterceptor 的功能跟过滤器类似,但是提供更精细的的控制能力:在request被响应之前、request被响应之后、视图渲染之前以及request全部结束之后。我们不能通过拦截器修改request内容,但是可以通过抛出异常(或者返回false)来暂停request的执行。
配置拦截器也很简单,Spring 为此提供了基础类WebMvcConfigurerAdapter ,我们只需要重写addInterceptors 方法添加注册拦截器。
实现自定义拦截器只需要3步:
1、创建我们自己的拦截器类并实现 HandlerInterceptor 接口。
2、创建一个 Java 类继承 WebMvcConfigurerAdapter,并重写 addInterceptors 方法。
3、实例化我们自定义的拦截器,然后将对像手动添加到拦截器链中(在addInterceptors方法中添加)。
正式开工
IP工具类
由于不清楚用户代理,最好能使用一个工具类来来获取用户真实IP。这个Google就能找到,我就不贴代码了。
数据库
我使用的是MySQL数据库,持久层框架为MyBatis。具体可参考”准备”步骤。
我在”myboot”数据库中创建一张表”blaclist”,属性如下:
| 字段名 | 解释 |
|---|---|
| id | 记录的id |
| ip | 用户真实IP |
| iptime | IP被锁时间 |
实体类
public class BlackList {
private int id;
private String ip;
private Date iptime; // 日期类型,格式:yyyy-MM-dd HH:mm:ss
//构造器
public BlackList() {
}
public BlackList(String ip, Date iptime) {
this.ip = ip;
this.iptime = iptime;
}
// get && set 方法
}
Dao层
注意XML配置与对应实体配置(省略)。
@Mapper
public interface BlackListDao {
// 根据IP来查找记录
List<BlackList> findByIp(String ip);
// 添加记录
int addBlackList(@Param("blackList") BlackList blackList);
}
实现 HandlerInterceptor 接口
public class URLInterceptor implements HandlerInterceptor {
@Autowired
BlackListDao blackListDao;
private Map<String, Integer> redisTemplate = new HashMap<String, Integer>();
private static final Logger logger = LoggerFactory.getLogger(URLInterceptor.class);
//在请求处理之前进行调用(Controller方法调用之前)
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
return true;
}
//请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
String ip = IPAddressUtil.getClientIpAddress(httpServletRequest);
List<BlackList> blackLists = blackListDao.findByIp(ip);
if (blackLists == null || blackLists.size() == 0){
urlHandle(httpServletRequest, 5000, 10);
} else {
//强制控制跳转
modelAndView.setViewName("/errorpage/error.html");
}
}
//在整个请求结束之后被调用
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
public void urlHandle(HttpServletRequest request, long limitTime,int limitCount) throws RequestLimitException {
/**
* 省略业务逻辑部分,参考"准备"步骤
*/
if (count > limitCount){ //符合锁定条件
Calendar calendar = Calendar.getInstance();
Date iptime=calendar.getTime();
BlackList blackList = new BlackList(ip, iptime);
blackListDao.addBlackList(blackList);
throw new RequestLimitException();
}
}
}
WebMvcConfigurerAdapter类
配置 spring mvc的拦截器 WebMvcConfigurerAdapter。
@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
@Bean //把我们的拦截器注入为bean
public HandlerInterceptor getMyInterceptor(){
return new URLInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 多个拦截器组成一个拦截器链
// addPathPatterns 用于添加拦截规则, 这里假设拦截 /url 后面的全部链接
// excludePathPatterns 用户排除拦截
registry.addInterceptor(getMyInterceptor()).addPathPatterns("/url/**");
super.addInterceptors(registry);
}
}
Controller类
@RequestMapping("/url/test")
@ResponseBody
public String URLtest() {
return "success";
}
项目参考地址 : https://github.com/FunriLy/springboot-study/tree/master/%E6%A1%88%E4%BE%8B8
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# spring
# boot实现IP黑名单
# boot拦截器
# boot
# ip
# 详解SpringBoot AOP 拦截器(Aspect注解方式)
# spring boot如何添加拦截器
# SpringBoot拦截器的使用小结
# SpringBoot定义过滤器、监听器、拦截器的方法
# Spring boot拦截器实现IP黑名单的完整步骤
# 拦截器
# 自定义
# 重写
# 只需要
# 来实现
# 结束之后
# 自己的
# 的是
# 是一个
# 我在
# 就能
# 多个
# 就不
# 不清楚
# 也很
# 可以通过
# 将对
# 可以使用
# 跳转
# 就将
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何使用查询构建器?(Query Builder高级用法)
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
如何快速搭建自助建站会员专属系统?
油猴 教程,油猴搜脚本为什么会网页无法显示?
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
JavaScript如何实现音频处理_Web Audio API如何工作?
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
教你用AI将一段旋律扩展成一首完整的曲子
北京专业网站制作设计师招聘,北京白云观官方网站?
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
Laravel怎么在Blade中安全地输出原始HTML内容
Laravel如何实现事件和监听器?(Event & Listener实战)
Laravel安装步骤详细教程_Laravel环境搭建指南
使用Dockerfile构建java web环境
node.js报错:Cannot find module 'ejs'的解决办法
深圳网站制作培训,深圳哪些招聘网站比较好?
详解jQuery中的事件
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
如何快速上传建站程序避免常见错误?
Laravel如何使用Telescope进行调试?(安装和使用教程)
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
香港服务器网站推广:SEO优化与外贸独立站搭建策略
用yum安装MySQLdb模块的步骤方法
微信小程序制作网站有哪些,微信小程序需要做网站吗?
如何在腾讯云服务器上快速搭建个人网站?
nginx修改上传文件大小限制的方法
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
深圳网站制作平台,深圳市做网站好的公司有哪些?
如何在IIS中新建站点并配置端口与物理路径?
简单实现jsp分页
Laravel如何实现用户密码重置功能?(完整流程代码)
,网页ppt怎么弄成自己的ppt?
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
利用JavaScript实现拖拽改变元素大小
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
Laravel如何实现API版本控制_Laravel版本化API设计方案
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
高防服务器:AI智能防御DDoS攻击与数据安全保障
如何确保FTP站点访问权限与数据传输安全?
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
JS去除重复并统计数量的实现方法
5种Android数据存储方式汇总
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
Laravel distinct去重查询_Laravel Eloquent去重方法
如何有效防御Web建站篡改攻击?
Java垃圾回收器的方法和原理总结

