springboot實(shí)現(xiàn)增加黑名單和白名單功能
題外話
關(guān)于黑名單和白名單功能,我覺得可以直接用linux服務(wù)器的iptables或nftables來實(shí)現(xiàn)黑名單和白名單功能。這兩個(gè)工具都是Linux系統(tǒng)上用于配置防火墻規(guī)則的命令行工具。
iptables:
描述: iptables 是一個(gè)用于配置IPv4數(shù)據(jù)包過濾規(guī)則的工具。它是Linux系統(tǒng)上最常用的防火墻工具之一。
命令示例:
- 添加黑名單規(guī)則:
sudo iptables -A INPUT -s <黑名單IP地址> -j DROP - 添加白名單規(guī)則:
sudo iptables -A INPUT -s <白名單IP地址> -j ACCEPT
nftables:
描述: nftables 是一個(gè)用于配置網(wǎng)絡(luò)過濾和分類規(guī)則的框架,可以替代iptables。它支持IPv4和IPv6,并提供更靈活的語法。
命令示例:
- 添加黑名單規(guī)則:
sudo nft add rule ip filter input ip saddr <黑名單IP地址> drop - 添加白名單規(guī)則:
sudo nft add rule ip filter input ip saddr <白名單IP地址> accept
在選擇使用哪個(gè)工具時(shí),您可以根據(jù)您的偏好以及系統(tǒng)是否已經(jīng)采用nftables來進(jìn)行選擇。新er版本的Linux系統(tǒng)通常更傾向于使用nftables。請注意,上述命令中的<黑名單IP地址>和<白名單IP地址>需要替換為實(shí)際的IP地址。
無論您選擇使用iptables還是nftables,都需要小心配置規(guī)則,以確保不會阻止您訪問服務(wù)器。在配置之前,請確保您了解防火墻規(guī)則的工作原理和影響。
或者像openai一樣使用cf防護(hù)也就是CloudFlare作為其服務(wù)的安全防護(hù)層。
這里就不講那么多題外話,開始我們的springboot實(shí)現(xiàn)黑名單和白名單功能
先講一下springboot實(shí)現(xiàn)黑白名單的原理,很簡單,就是單純的實(shí)現(xiàn)filter,然后注冊到springboot里面,在filter里面進(jìn)行黑白名單的篩選
第一步:創(chuàng)建一個(gè)springboot項(xiàng)目

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,它內(nèi)置的tomcat是10及其以上的。所以引入的依賴是jakarta,可能你們版本比較低的,可以使用javax
第二步:創(chuàng)建一個(gè)過濾器類
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);
}
// 可以實(shí)現(xiàn) init 和 destroy 方法,根據(jù)需要進(jìn)行處理
}
第三步:注冊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;
}
}
第四步:開始測試

在這里面編寫白名單和黑名單。由于每次請求都會經(jīng)過Filter,所以在這里面可以實(shí)現(xiàn)除了我設(shè)置的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
結(jié)果如下:

修改白名單

再次訪問:

很簡單就成功了。
到此這篇關(guān)于springboot實(shí)現(xiàn)增加黑名單和白名單功能的文章就介紹到這了,更多相關(guān)springboot 黑名單和白名單內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JSP頁面?zhèn)鲄⒊霈F(xiàn)中文亂碼的解決方案
這篇文章主要介紹了JSP頁面?zhèn)鲄⒊霈F(xiàn)中文亂碼的解決方案,非常實(shí)用,需要的朋友可以參考下2014-08-08
Springboot實(shí)現(xiàn)異步任務(wù)線程池代碼實(shí)例
這篇文章主要介紹了Springboot實(shí)現(xiàn)異步任務(wù)線程池代碼實(shí)例,異步任務(wù)線程池是一種用于處理異步任務(wù)的機(jī)制,它可以提高程序的并發(fā)性能和響應(yīng)速度,通過將任務(wù)提交給線程池,線程池會自動管理線程的創(chuàng)建和銷毀,從而避免了頻繁創(chuàng)建和銷毀線程的開銷,需要的朋友可以參考下2023-10-10
Spring中Transactional注解使用的心得(推薦)
這篇文章主要介紹了Spring中Transactional注解使用的心得,事務(wù)是用來控制數(shù)據(jù)的ACID特性的,用于保證數(shù)據(jù)的正確性和完整性,需要的朋友可以參考下2022-10-10
java代碼關(guān)閉tomcat程序及出現(xiàn)問題解析
這篇文章主要介紹了java代碼關(guān)閉tomcat程序 及出現(xiàn)問題解析,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2019-05-05
mybatis-plus 處理大數(shù)據(jù)插入太慢的解決
這篇文章主要介紹了mybatis-plus 處理大數(shù)據(jù)插入太慢的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Java編程實(shí)現(xiàn)比對兩個(gè)文本文件并標(biāo)記相同與不同之處的方法
這篇文章主要介紹了Java編程實(shí)現(xiàn)比對兩個(gè)文本文件并標(biāo)記相同與不同之處的方法,涉及java針對文本文件的讀取、遍歷、判斷等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10

