springboot实现黑名单和白名单功能

题外话

       关于黑名单和白名单功能,我觉得可以直接用linux服务器的iptables或nftables来实现黑名单和白名单功能。这两个工具都是Linux系统上用于配置防火墙规则的命令行工具。

  1. iptables:

    • 描述: iptables 是一个用于配置IPv4数据包过滤规则的工具。它是Linux系统上最常用的防火墙工具之一。
    • 命令示例:
      • 添加黑名单规则:sudo iptables -A INPUT -s <黑名单IP地址> -j DROP
      • 添加白名单规则:sudo iptables -A INPUT -s <白名单IP地址> -j ACCEPT
  2. nftables:

    • 描述: nftables 是一个用于配置网络过滤和分类规则的框架,可以替代iptables。它支持IPv4和IPv6,并提供更灵活的语法。
    • 命令示例:
      • 添加黑名单规则:sudo nft add rule ip filter input ip saddr <黑名单IP地址> drop
      • 添加白名单规则:sudo nft add rule ip filter input ip saddr <白名单IP地址> accept

       在选择使用哪个工具时,您可以根据您的偏好以及系统是否已经采用nftables来进行选择。新er版本的Linux系统通常更倾向于使用nftables。请注意,上述命令中的<黑名单IP地址><白名单IP地址>需要替换为实际的IP地址。

       无论您选择使用iptables还是nftables,都需要小心配置规则,以确保不会阻止您访问服务器。在配置之前,请确保您了解防火墙规则的工作原理和影响。

       或者像openai一样使用cf防护也就是CloudFlare作为其服务的安全防护层。

这里就不讲那么多题外话,开始我们的springboot实现黑名单和白名单功能

先讲一下springboot实现黑白名单的原理,很简单,就是单纯的实现filter,然后注册到springboot里面,在filter里面进行黑白名单的筛选

第一步:创建一个springboot项目

pom文件的依赖:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

注意:由于我使用的是springboot3,它内置的tomcat是10及其以上的。所以引入的依赖是jakarta,可能你们版本比较低的,可以使用javax

第二步:创建一个过滤器类

package org.cyl.test.fliter;
import jakarta.servlet.*;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class BlackWhiteListFilter implements Filter {

    private List<String> blackList = Arrays.asList("blocked-ip1", "blocked-ip2");
    private List<String> whiteList = Arrays.asList("127.0.0.1", "0:0:0:0:0:0:0:1");

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        String clientIP = request.getRemoteAddr();

        // 检查黑名单
        if (blackList.contains(clientIP)) {
            response.getWriter().write("Your IP is blacklisted.");
            return;
        }

        // 检查白名单
        if (!whiteList.contains(clientIP)) {
            response.getWriter().write("Your IP is not whitelisted.");
            return;
        }

        chain.doFilter(request, response);
    }

    // 可以实现 init 和 destroy 方法,根据需要进行处理
}

第三步:注册config类:

package org.cyl.test.config;
import org.cyl.test.fliter.BlackWhiteListFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebConfig {

    @Bean
    public FilterRegistrationBean<BlackWhiteListFilter> myFilter() {
        FilterRegistrationBean<BlackWhiteListFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new BlackWhiteListFilter());
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }
}

第四步:开始测试

在这里面编写白名单和黑名单。由于每次请求都会经过Filter,所以在这里面可以实现除了我设置的127.0.0.1和0:0:0:0:0:0:0:1之外,其他ip无法访问的情况。

编写controller类

package org.cyl.test.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/allowed-endpoint")
    public String sayHello(){
        return "Hello";
    }
}

访问localhost:8080/allowed-endpoint

结果如下:

修改白名单

再次访问:

很简单就成功了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Netty开篇——NIO章中(四)

通道(Channel) Channel类似于流&#xff0c;有些区别 同时进行读写&#xff0c;而流只能读或者只能写实现异步读写数据可以从缓冲读数据&#xff0c;也可以写数据到缓冲 Channel在 NIO 中是一个接口:public interface Channel extends Closeable{} 常用的Channel类有:FileChan…

【昕宝爸爸小模块】深入浅出之JDK21 中的虚拟线程到底是怎么回事(二)

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…

Arthas项目实战用法

一、简介 1、项目所在位置 2、安装Arthas 1. 下载arthas-boot.jar 2. 运行arthas-boot.jar 3. 选择进程 3、卸载Arthas 二、核心监视功能 1、monitor&#xff1a;监控方法的执行情况 2、watch&#xff1a;检测函数返回值 3、trace&#xff1a;根据路径追踪&#xff0c;…

低代码自动化测试的实践

何为低代码测试 传统上&#xff0c;功能、 UI、端到端等测试自动化的实现都涉及编写测试脚本&#xff0c;代替测试人员执行重复的手动测试任务。自动化脚本的开发工作通常由 QA 工程师或开发人员完成&#xff0c;这需要编写大量代码。 而低代码甚至无代码的理念也是在自动化测…

海外盲盒系统搭建:盲盒出海成为了盲盒企业的新机遇

盲盒在我国作为一个新型的消费模式&#xff0c;取得了较大的成功&#xff0c;也成为了当下流行的潮玩文化。盲盒在国内爆火的优势下&#xff0c;也为我国盲盒出海提供了市场基础。当下&#xff0c;海外市场具有较大的发展潜力&#xff0c;除此之外&#xff0c;盲盒出海也成为当…

transformer详解

transformer 框架注意力机制注意力评分函数(scoring function)自注意力机制&#xff08;self-attention&#xff09;masked self-attention多头注意力&#xff08;multi-head attention&#xff09; 位置编码Layer normalizationResnet&#xff08;Add&#xff09; 框架 框架解…

使用AI自动生成PPT提高制作效率

使用AI自动生成PPT提高制作效率 在制作PPT方面&#xff0c;很多制作者都会轻易跳进一个怪圈&#xff1a;“我要制作一个关于关爱老人的PPT&#xff0c;该怎么做呢&#xff0c;有模板没有?”这个会涉及很多逻辑需要经过不断的思考&#xff0c;制作PPT要通过很多素材、使用技巧、…

【报错】检索 COM 类工厂中 CLSID 为 {28E68F9A-8D75-11D1-8DC3-3C302A000000} 的组件失败错误

情况描述 在使用C#进行工控软件开发&#xff0c;需要连接通过OPC连接DCS系统时&#xff0c;需要通过visual studio的NuGet包管理器添加OpcAutomation&#xff0c;如下图所示&#xff1a; 这样便可以实现通过C#连接读取数据。但是在通过C#连接OPC server时&#xff0c;会出现错…

性能压力测试:企业成功的关键要素

性能压力测试在现代企业软件开发中扮演着至关重要的角色&#xff0c;它不仅仅是一项技术手段&#xff0c;更是保障企业成功的关键要素。本文将探讨性能压力测试在企业中的重要性&#xff0c;并阐述其对业务稳定性、用户体验和品牌声誉的影响。 一、保障业务稳定性 1、应对高负载…

java数据结构与算法刷题-----LeetCode96. 不同的二叉搜索树

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

走迷宫之推箱子

前言&#xff1a; 在上一篇文章当中我介绍了一个走迷宫的写法&#xff0c;但是那个迷宫没什么可玩性和趣味性&#xff0c;所以我打算在迷宫的基础上加上一个推箱子&#xff0c;使之有更好的操作空间&#xff0c;从而增强了游戏的可玩性和趣味性。 1. 打印菜单 void menu() {…

[WUSTCTF2020]alison_likes_jojo 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 得到的 flag 请包上 flag{} 提交。 感谢 Iven Huang 师傅供题。 比赛平台&#xff1a;https://ctfgame.w-ais.cn/ 密文&#xff1a; 下载附件解压&#xff0c;得到两张jpg图片和一个文本文件。 解题思路&#x…

HNU-编译原理-实验2-Bison

编译原理实验2Bison 计科210X 甘晴void 202108010XXX 实验要求 详细的实验项目文档为 https://gitee.com/coderwym/cminus_compiler-2023-fall/tree/master/Documentations/lab2 实验步骤 本次实验需要在 Lab1 已完成的 flex 词法分析器的基础上&#xff0c;进一步使用 b…

【Java】源码文件开头添加注释

需求 应公司质量部要求&#xff0c;需要对代码做静态检查。质量部要求&#xff0c;源码文件必须在起始行起设置一些注释&#xff0c;然而项目已经开发了一年之久&#xff0c;且没有维护这个注释。 此时&#xff0c;面对好几千个源码文件&#xff0c;我们如何快速添加相应的注…

滑块拖动验证

效果 代码 svg图标 初始图标 <svg t"1705397535958" class"icon" viewBox"0 0 1024 1024" version"1.1" xmlns"http://www.w3.org/2000/svg" p-id"1492" width"200" height"200">&l…

Kubernetes核心实战

kubernetes&#xff08;一&#xff09;概述与架构 kubernetes&#xff08;二&#xff09;创建集群 云原生实战 语雀 官网 Kubernetes 文档 | Kubernetes B站课程&#xff1a;https://www.bilibili.com/video/BV13Q4y1C7hS/?p41 1.Namespace 名称空间&#xff0c;用来对集群…

【书生·浦语】大模型实战营——LMDeploy 大模型量化部署实战

大模型部署背景 大模型部署是指将训练好的模型在特定的软硬件环境中启动的过程&#xff0c;使模型能够接收输入并返回预测结果。大模型的内存开销巨大&#xff0c;7B模型仅权重需要14G内存。另外大模型是自回归生成&#xff0c;需要缓存Attention的 k/v。 LMDeploy 简介 推理性…

SpringMVC请求源码分析

文章目录 一、SpringMVC简介1. 概念2. 从Servlet到SprigMVC3. SpringMVC的XML实现4. SpringMVC的请求流程 二、SpringMVC源码分析1. SpringMVC启动流程验证2. 细节补充 一、SpringMVC简介 1. 概念 官网介绍 Spring Web MVC is the original web framework built on the Servl…

【Leetcode】82. 删除排序链表中的重复元素 II

文章目录 题目思路代码 题目 82. 删除排序链表中的重复元素 II 题目&#xff1a;给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,…

uni-app的项目创建和环境搭建

uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、Web&#xff08;响应式&#xff09;、以及各种小程序&#xff08;微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝&#xff09;、快应用等多个平台。 第一步…