SpringBoot3利用AOP实现IP黑名单功能

 更新时间:2024年09月19日 11:49:26   作者:大阔  
在Web应用开发中,控制对特定IP地址的访问权限是一个常见的需求,通过实现IP黑白名单功能,我们可以允许某些IP地址访问应用,同时拒绝其他IP地址的访问,本文将详细介绍SpringBoot3利用AOP实现IP黑名单功能,并附上相应的代码片段,需要的朋友可以参考下

本文主要介绍如何使用AOP实现IP黑名单功能

主要涉及三个类

  • 注解类
  • 切面实现类
  • Controller类

注解类

在注解中包含了几个检测参数

@Target(ElementType.METHOD)  
@Retention(RetentionPolicy.RUNTIME)  
public @interface IPBlackList {  
    int maxRequests() default 10; // 最大请求次数  
    long timeWindow() default 60000L; // 计数时间窗口,单位:毫秒  
    long blockTime() default 60000L; // 拉黑时间,单位:毫秒  
}

切面实现

在doBefore方法中我调了自己的工具类不过就是一个获取请求ip的方法,还有我过滤了内网ip,如果不需要可以去掉。

@Aspect  
@Component  
public class IPBlackListAspect {  
  
    private final Map<String, List<Long>> requestTimes = new ConcurrentHashMap<>();  
    private final Map<String, Long> blackList = new ConcurrentHashMap<>();  
  
    @Before(value = "@annotation(ipBlackList)")  
    public void doBefore(IPBlackList ipBlackList) {  
        String clientIP = ServletUtils.getClientIP();  
        if (StringUtils.isBlank(clientIP)) {  
            return;  
        }        // 内网不查询  
        clientIP = StringUtils.contains(clientIP, "0:0:0:0:0:0:0:1") ? "127.0.0.1" : HtmlUtil.cleanHtmlTag(clientIP);  
        if (NetUtil.isInnerIP(clientIP)) {  
            return;  
        }
		int maxRequests = ipBlackList.maxRequests();  
        long timeWindow = ipBlackList.timeWindow();  
        long blockTime = ipBlackList.blockTime();  
  
        long currentTime = System.currentTimeMillis();  
  
        // 检查 IP 是否在黑名单中  
        if (blackList.containsKey(clientIP)) {  
            long blacklistedAt = blackList.get(clientIP);  
            if (currentTime - blacklistedAt < blockTime) {  
                throw new RuntimeException("IP 已被拉黑,请稍后再试");  
            } else {  
                blackList.remove(clientIP); // 移除过期的黑名单记录  
                blackList.remove(clientIP); // 重置计时  
            }  
        }  
        // 获取该 IP 的访问记录并清除超过时间窗口的记录  
        List<Long> times = requestTimes.getOrDefault(clientIP, new CopyOnWriteArrayList<>());  
        times.removeIf(time -> currentTime - time > timeWindow);  
        times.add(currentTime); // 记录当前访问时间  
        requestTimes.put(clientIP, times);  
  
        // 检查在时间窗口内的请求次数  
        if (times.size() > maxRequests) {  
            blackList.put(clientIP, currentTime); // 拉黑 IP
			throw new RuntimeException("请求次数过多,IP 已被拉黑");  
        }  
    }  
  
}

Controller

只要在Http请求方法上加上上面定义的注解就可以

@RestController()  
@RequestMapping("/auth/auth")  
public class YunfuAuthController {  
  
    @Resource  
    private IYunfuAuthService yunfuAuthService;  
    
    @PostMapping  
    @SaIgnore
	@IPBlackList
	public R<YunfuAuthVo> auth(YunfuAuthBo bo){  
        return R.ok(yunfuAuthService.auth(bo));  
    }  
  
}

后言

到此这篇关于SpringBoot3利用AOP实现IP黑名单功能的文章就介绍到这了,更多相关SpringBoot3 IP黑名单内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Java如何判断ResultSet结果集是否为空

    详解Java如何判断ResultSet结果集是否为空

    ResultSet 表示 select 语句的查询结果集。这篇文章主要为大家详细介绍了Java如何判断ResultSet结果集是否为空,感兴趣的可以了解一下
    2023-02-02
  • 使用Spring boot标记一个方法过时

    使用Spring boot标记一个方法过时

    这篇文章主要介绍了使用Spring boot标记一个方法过时,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 一文讲透为什么遍历LinkedList要用增强型for循环

    一文讲透为什么遍历LinkedList要用增强型for循环

    这篇文章主要为大家介绍了为什么遍历LinkedList要用增强型for循环的透彻详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Netty分布式固定长度解码器实现原理剖析

    Netty分布式固定长度解码器实现原理剖析

    这篇文章主要为大家介绍了Netty分布式固定长度解码器原理剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • java pdf加水印的方法

    java pdf加水印的方法

    这篇文章主要为大家详细介绍了java pdf加水印的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Json转化为Java对象的实例详解

    Json转化为Java对象的实例详解

    这篇文章主要介绍了Json转化为Java对象的实例详解的相关资料,前后端数据交互的情况经常会遇到Json串与java 对象的相互转换方便操作,需要的朋友可以参考下
    2017-08-08
  • 解析spring cloud ouath2中的Eureka

    解析spring cloud ouath2中的Eureka

    这篇文章主要介绍了spring cloud ouath2中的Eureka,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • java同步器AQS架构AbstractQueuedSynchronizer原理解析下

    java同步器AQS架构AbstractQueuedSynchronizer原理解析下

    这篇文章主要为大家介绍了java同步器AQS架构AbstractQueuedSynchronizer原理解析下,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • spring boot使用sharding jdbc的配置方式

    spring boot使用sharding jdbc的配置方式

    这篇文章主要介绍了spring boot使用sharding jdbc的配置方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Java 数据库连接池 DBCP 的介绍

    Java 数据库连接池 DBCP 的介绍

    这篇文章主要给大家分享的是 Java 数据库连接池 DBCP 的介绍, 是 Apache 旗下 Commons 项目下的一个子项目,提供连接池功能DBCP,下面来看看文章的具体介绍内容吧,需要的朋友可以参考一下
    2021-11-11

最新评论