java——ip黑名单设计方案(大全+实战)

java——ip黑名单设计方案(大全+实战)大家好,今天来设计一个ip黑名单功能。即封禁一些类似ddos的非法ip环境:springboot+jdk11本文源码地址:https://gitee.com/xue-shangren/blog-src/tree/master/java-blac...自定义拦截器思路:将黑名单ip存入一个txt文件中(置于resources下),用一个bean去加载文件内容,并存入一个Set中。然后自定义拦截器,去对ip进行检查。实例代码1.先创建一个blackList.txt文件,存入黑名单ip,如图所示。
图片
2.然后创建一个IpService,在构造函数中去加载这个txt文件,并写入Set中。
java——ip黑名单设计方案(大全+实战)_第1张图片

java——ip黑名单设计方案(大全+实战)_第2张图片
并向外提供Set的访问方式,让装载IpService的其他类调用,检查ip。
java——ip黑名单设计方案(大全+实战)_第3张图片
3.自定义黑名单ip拦截器,用于第一层处理非法ip。记录日志
java——ip黑名单设计方案(大全+实战)_第4张图片
在该拦截器中,我们从request中获取到真实ip,并进行检查。若Set中存在该ip则拦截,否则通过。4.注册自定义拦截器
java——ip黑名单设计方案(大全+实战)_第5张图片
测试结果
图片

图片

图片
自定义过滤器过滤器依赖于Servlet容器,并且不能获取IOC容器的bean,所以springboot一般不用自定义filter去搞这种,因为不能注入service等@bean。很难受Q:为什么过滤器不能获取IOC容器的bean吗,而拦截器可以A:过滤器由Servlet容器管理(Tomcat,Netty),它的初始化在spring之前。而拦截器则是在controller之前,在spring初始化后初始化。上有政策,下有对策。过滤器也可以实现黑名单ip这里提供一种思路,而不是说它的可行性。思路:由于过滤器可以处理Servlet,所以可以使用ServletContext去存一个key-value,也就是黑名单列表。在请求到来的时候,用监听器监听该Servlet,并将文件加载并存入该Servlet的ServletContext中。然后用filter去手动检查该ip是否存在。该方法参考博客:https://blog.csdn.net/gy99csdn/article/details/114336738jmx注册MBean注册到JMX,黑名单ip保留为一个set,监控程序去动态添加结合spring sercuity黑名单ip保存到yml中思路:将黑名单ip保存到yml文件中,通过@ConfigurationProperties注解去获取到blackips。然后在SecurityConfig中根据request进行Match。
java——ip黑名单设计方案(大全+实战)_第6张图片

java——ip黑名单设计方案(大全+实战)_第7张图片
如上所示:registry根据request进行匹配,当匹配黑名单ip时,就将其拦截,否则放行。缺点很明显:yml文件是项目写死的。不能动态实时更新这些黑名单ip,只能重启应用。一般不采取jmx动态配置JMX(java management Extensions),是一个jdk自带的java平台监控和管理接口。它提供了一种获取java程序的内存,cpu,线程状态,jvm参数等运行信息的规范(就像servlet标准对应一个个请求)其他运维程序通过实现jmx接口,即可它获取正在运行的java程序的内存,cpu,线程状态,jvm参数等信息如jconsole,Zabbix等运维工具jmx将所有被管理的资源都称为MBean(Managed Bean),这些MBean全部由MBeanServer管理,如果要访问MBean,可以通过MBeanServer对外提供的访问接口,例如通过RMI或HTTP访问。jmx内置在javase标准库这里我们通过编写一个Mbean并通过spring注册到jmx中,然后通过jconsole动态调整ip黑名单1.注册Mbean/ @Author:xsr @Date:2024/1/29 18:49 黑名单ip服务类 Mbean /@Component@ManagedResource(objectName = "sample:name=blacklist",description = "Blacklist of IP addresses")public class BlacklistMBean {    private Set ips = new HashSet<>();    @ManagedAttribute(description = "Get IP addresses in blacklist")    public String[] getBlacklist() {        return ips.toArray(String[]::new);   }​    @ManagedOperation    @ManagedOperationParameter(name = "ip", description = "Target IP address that will be added to blacklist")    public void addBlacklist(String ip) {        ips.add(ip);   }​    @ManagedOperation    @ManagedOperationParameter(name = "ip", description = "Target IP address that will be removed from blacklist")    public void removeBlacklist(String ip) {        ips.remove(ip);   }​    /     该方法不被MbeanServer管理     @param ip     @return     /    public boolean shouldBlock(String ip) {        return ips.contains(ip);   }​}​然后重启服务,通过jconsole查看注册的属性和操作。
java——ip黑名单设计方案(大全+实战)_第8张图片
然后我们可以jconsole的界面,向addBlacklist和removeBlacklist传参,并手动调用方法。这个set集合ips就会在运行中添加/删除你要操作的ip。
java——ip黑名单设计方案(大全+实战)_第9张图片
该方案好处:胜于重启项目来更新yml配置,类似热更新,可在运维平台手动操作黑名单不足:仍需手动操作。分布式在分布式架构中,可以使用统一网关鉴权,也可以使用中心化黑名单存储,后者需要注意各节点同步:即当某个节点更新黑名单时,其他节点能够及时获取最新的黑名单信息。持久化存储:可以考虑使用持久化存储(数据库)来确保黑名单信息在服务重启后不会丢失各节点的缓存机制:各节点上可以使用缓存机制来存储最近使用过的黑名单信息,以减少对中心化服务的频繁访问异步操作中心黑名单:中心化服务在更新黑名单时可以通过消息队列通知各个节点进行异步更新,而不是同步阻塞业务参考:https://blog.csdn.net/qq_25620555/article/details/84262577htt...关键词:java黑名单设计;spring security黑名单设计;ConfigurationProperties代替txt文件的黑名单设计https://www.liaoxuefeng.com/wiki/1252599548343744/12823856876...

你可能感兴趣的:(java)