基于Spring Boot实现IP黑白名单功能

在Web应用开发中,控制对特定IP地址的访问权限是一个常见的需求。通过实现IP黑白名单功能,我们可以允许某些IP地址访问应用,同时拒绝其他IP地址的访问。在Spring Boot框架中,我们可以通过自定义过滤器(Filter)来实现这一功能。本文将详细介绍如何在Spring Boot应用中实现IP黑白名单功能,并附上相应的代码片段。

一、配置IP黑白名单

首先,我们需要在配置文件中定义IP黑白名单。在application.yml文件中,我们可以添加如下配置:

ip:  whitelist: 192.168.1.1,192.168.1.2  blacklist: 192.168.1.3,192.168.1.4

这里我们定义了两个列表,分别表示白名单和黑名单中的IP地址。

二、创建IP黑白名单过滤器

接下来,我们需要创建一个自定义的过滤器,用于检查请求的IP地址是否在黑白名单中。过滤器类IpFilter的实现如下:

import javax.servlet.*;  
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.stream.Collectors;  
import org.springframework.beans.factory.annotation.Value;  
import org.springframework.stereotype.Component;  @Component  
public class IpFilter implements Filter {  @Value("${ip.whitelist}")  private String whitelistStr;  @Value("${ip.blacklist}")  private String blacklistStr;  private List<String> whitelist;  private List<String> blacklist;  @Override  public void init(FilterConfig filterConfig) throws ServletException {  whitelist = Arrays.stream(whitelistStr.split(","))  .map(String::trim)  .collect(Collectors.toList());  blacklist = Arrays.stream(blacklistStr.split(","))  .map(String::trim)  .collect(Collectors.toList());  }  @Override  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {  HttpServletRequest httpRequest = (HttpServletRequest) request;  String ip = httpRequest.getRemoteAddr();  if (whitelist.contains(ip)) {  // 白名单IP,直接通过  chain.doFilter(request, response);  } else if (blacklist.contains(ip)) {  // 黑名单IP,拒绝访问  HttpServletResponse httpResponse = (HttpServletResponse) response;  httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "IP is in blacklist");  } else {  // 非黑白名单IP,根据业务需求处理(例如:允许或拒绝)  chain.doFilter(request, response);  }  }  @Override  public void destroy() {  // 清理资源,如果有的话  }  }

在IpFilter类中,我们使用@Value注解从配置文件中读取黑白名单配置,并在init方法中将其转换为列表。在doFilter方法中,我们获取请求的IP地址,并根据其是否在黑白名单中决定是否允许访问。

三、注册过滤器

最后,我们需要在Spring Boot的配置类中注册这个过滤器。通过创建一个FilterRegistrationBean实例并将其添加到Spring容器中,我们可以实现过滤器的注册。配置类FilterConfig的实现如下:

import org.springframework.boot.web.servlet.FilterRegistrationBean;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  @Configuration  
public class FilterConfig {  @Bean  public FilterRegistrationBean<IpFilter> ipFilterRegistration() {  FilterRegistrationBean<IpFilter> registrationBean = new FilterRegistrationBean<>();  registrationBean.setFilter(new IpFilter());  registrationBean.addUrlPatterns("/*"); // 设置过滤器拦截的路径  registrationBean.setName("ipFilter");  registrationBean.setOrder(1); // 设置过滤器的顺序  return registrationBean;  }  }

在FilterConfig类中,我们创建了一个FilterRegistrationBean实例,并将其返回的Bean注册到Spring容器中。通过设置addUrlPatterns方法,我们指定了过滤器需要拦截的路径(这里拦截所有路径)。通过setOrder方法,我们可以设置过滤器的执行顺序。

四、总结

通过以上步骤,我们成功在Spring Boot应用中实现了IP黑白名单功能。通过自定义过滤器IpFilter,并结合Spring的配置类FilterConfig,我们能够在请求到达应用之前对IP地址进行校验,确保只有符合黑白名单规则的IP能够访问应用。

在实际应用中,可能还需要考虑一些额外的细节,比如:

  1. 动态更新黑白名单:当前实现中,黑白名单是从配置文件中读取的,如果需要动态更新黑白名单,可以考虑使用数据库或缓存等方式存储黑白名单,并在过滤器中实时查询。

  2. 性能优化:对于大型应用或高并发场景,频繁查询黑白名单可能会影响性能。可以考虑使用缓存机制,将黑白名单缓存到内存中,减少数据库或配置文件的读取次数。

  3. 异常处理:在过滤器中处理请求时,可能会出现各种异常情况(如网络问题、配置错误等)。应该合理处理这些异常,确保应用的稳定性和可用性。

总之,基于Spring Boot实现IP黑白名单功能是一个相对简单的任务,通过自定义过滤器和配置类的组合,我们可以轻松实现这一功能,并根据实际需求进行扩展和优化。希望本文对您有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/830200.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

由于找不到xinput1_3.dll,无法继续执行代码的详细修复方法

在日常使用电脑进行工作或娱乐时&#xff1a;系统突然弹出一个错误提示&#xff0c;明确指出“xinput1_3.dll文件丢失”。这个问题可能会导致游戏无法正常运行。为了解决这个问题&#xff0c;我通过查阅资料和实践总结出了以下五种解决方法&#xff0c;希望能对遇到类似问题的朋…

Mysql基础(三)DDL之create table语句

一 create table 创表 说明&#xff1a; create table相关语句从功能上进行讲解补充&#xff1a; 前面已经讲解过相关的约束,已进行相关的铺垫声明&#xff1a; 参考价值较少,了解即可 ① 基本语法 思考&#xff1a; 约束加在哪里? ② 创建新表 强调&#xff1a;使…

任务调度xxljob的使用记录

1.基本使用 a.下载代码&#xff0c;地址&#xff1a;https://gitee.com/xuxueli0323/xxl-job.git b.执行sql&#xff0c;修改配置&#xff0c;启动任务调度中心的代码 启动代码后任务调度中心访问地址&#xff1a;http://localhost:8080/xxl-job-admin&#xff08;自己机器…

岚图汽车与东软睿驰签署战略合作协议

4月26日,东软睿驰与岚图汽车正式签署战略合作协议,双方将结合在各自领域拥有的产业资源、技术研发和资本运作等优势,聚焦智能化产品和应用,建立长期共赢的战略合作伙伴关系,通过不断探索未来新技术、新产业、新业态和新模式,围绕用户需求共同打造极致的智能出行体验。 图为岚图…

Rust Web开发实战:打造高效稳定的服务端应用

Rust Web开发实战&#xff1a;打造高效稳定的服务端应用 本书将带领您从零开始构建Web应用程序&#xff0c;无论是API、微服务还是单体应用&#xff0c;都将一一涵盖。您将学到如何优雅地对外开放API&#xff0c;如何连接数据库以安全存储数据&#xff0c;以及如何对应用程序进…

VPN的基本概念

随着互联网的普及和应用的广泛&#xff0c;网络安全和隐私保护越来越受到人们的关注。在这个信息爆炸的时代&#xff0c;我们的个人信息、数据通信可能会受到各种威胁&#xff0c;如何保护自己的隐私和数据安全成为了一个迫切的问题。而VPN&#xff08;Virtual Private Network…

Quarto Dashboards 教程 3:Dashboard Data Display

「写在前面」 学习一个软件最好的方法就是啃它的官方文档。本着自己学习、分享他人的态度&#xff0c;分享官方文档的中文教程。软件可能随时更新&#xff0c;建议配合官方文档一起阅读。推荐先按顺序阅读往期内容&#xff1a; 1.quarto 教程 1&#xff1a;Hello, Quarto 2.qu…

混合注意力 ACmix | On the Integration of Self-Attention and Convolution

论文名称&#xff1a;《On the Integration of Self-Attention and Convolution》 论文地址&#xff1a;2111.14556 (arxiv.org) 卷积和自注意力是两种强大的表示学习技术&#xff0c;通常被认为是两种截然不同的并列方法。在本文中&#xff0c;我们展示了它们之间存在一种强烈…

history命令显示时间戳、IP地址、用户名

一、前置知识 history命令的功能是显示和管理用户所执行过的所有命令记录。这些记录默认被Linux系统保存。用户可以使用history命令查阅这些记录&#xff0c;也可以对其记录进行修改和删除操作。 history命令的常用参数如下&#xff1a; -a: 保存命令记录-c: 清空命令记录-d:…

JavaScript 如何理解柯里化函数结构及调用

文章目录 柯里化函数是什么逐步理解柯里化函数 柯里化函数是什么 柯里化&#xff08;Currying&#xff09;函数&#xff0c;又称部分求值&#xff0c;是一种函数转换技术。这种技术将一个接受多个参数的函数转换为一系列接受单一参数的函数。具体来说&#xff0c;一个柯里化的…

2024 java使用Graceful Response,告别自己去封装响应,可以接收数据异常,快看我这一篇,足够你用!

参考官网手册地址&#xff1a;快速入门 | Docs 一、导入依赖&#xff08;根据springboot查看对应依赖版本&#xff09; <!-- Graceful --><dependency><groupId>com.feiniaojin</groupId><artifactId>graceful-response</artifactId&g…

微信小程序与web-view网页进行通信的尝试

首先&#xff0c;微信小程序向web-view传递数据一般通过地址栏传参的形式&#xff08;给src赋值或者修改hash&#xff09;&#xff0c;这样一般就已经能够满足实际开发需求了&#xff0c;所以这里主要探讨web-view向微信小程序传参。下面&#xff0c;我们从官方文档入手&#x…

基于51单片机智能窗帘仿真设计( proteus仿真+程序+设计报告+讲解视频)

基于51单片机智能窗帘仿真设计( proteus仿真程序设计报告讲解视频&#xff09; 基于51单片机智能窗帘仿真设计 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真设计4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单资料下载链接&#xff1a; 仿真图proteus8.9及以上…

【JAVA进阶篇教学】第七篇:Spring中常用注解

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第七篇&#xff1a;Spring中常用注解 在Java Spring框架中&#xff0c;注解&#xff08;Annotation&#xff09;是一种元数据&#xff0c;它提供了关于程序代码的额外信息&#xff0c;这些信息可以用于编译时检查、运行时…

【国信华源北斗型雨量站新品亮相第三届防汛抗旱抢险新技术新产品展示会】

4月24—25日&#xff0c;第三届防汛抗旱抢险新技术、新产品应用研讨与展示会暨中国水利企业协会防灾与抢险装备技术分会年会在河南郑州召开。由《中国防汛抗旱》杂志社、水利部防洪抗旱减灾工程技术研究中心主办&#xff0c;围绕我国防汛抗旱形势、防灾与抢险新技术新产品现状和…

vue2实现字节流byte[]数组的图片预览

项目使用vantui框架&#xff0c;后端返回图片的字节流byte[]数组&#xff0c;在移动端实现预览&#xff0c;实现代码如下&#xff1a; <template><!-- 附件预览 --><div class"file-preview-wrap"><van-overlay :show"show"><…

【Markdown笔记】——设置markdown中文字的颜色

【Markdown笔记】——设置markdown中文字的颜色 Markdownmarkdown中设置文字颜色常用颜色对照表【含RGB值对照】 &#x1f49d;&#x1f49d;&#x1f49d; 欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#x…

笔记:能量谱密度与功率谱密度(二)

目录 一、ESD与PSD的定义、单位、性质 二、对ESD与PSD的直观理解 三、总结&#xff1a; 某物理量的“分布”在离散系统中&#xff0c;各点(纵坐标含义&#xff09;的物理意义仍然是该物理量&#xff0c;而在连续系统中&#xff0c;各点&#xff08;纵坐标含义&#xff09;的物…

实战干货|Spark 在袋鼠云数栈的深度探索与实践

Spark 是一个快速、通用、可扩展的大数据计算引擎&#xff0c;具有高性能、易用、容错、可以与 Hadoop 生态无缝集成、社区活跃度高等优点。在实际使用中&#xff0c;具有广泛的应用场景&#xff1a; 数据清洗和预处理&#xff1a;在大数据分析场景下&#xff0c;数据通常需要…

后台架构总结

前言 疫情三年&#xff0c;全国各地的健康码成为了每个人的重要生活组成部分。虽然过去一年&#xff0c;但是回想起来任然历历在目。 今天我就通过当时基于小程序的健康码架构&#xff0c;来给大家讲一下如何基于java&#xff0c;springboot等技术来快速搭建一个后台业务系统…