Spring Boot 實現防盜鏈

在 Spring Boot 項目中實現防盜鏈可以通過多種方式,下面為你介紹兩種常見的實現方法,分別是基于請求頭 Referer 和基于令牌(Token)的防盜鏈。

基于請求頭 Referer 的防盜鏈

這種方法通過檢查請求頭中的 Referer 字段,判斷請求是否來自合法的來源。如果不是,則拒絕該請求。
以下是實現步驟和示例代碼:

  1. 創建一個過濾器:用于攔截請求并檢查 Referer 字段。
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
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.Objects;public class AntiLeachingFilter implements Filter {private List<String> allowedReferers;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {String refererConfig = filterConfig.getInitParameter("allowedReferers");if (Objects.nonNull(refererConfig)) {allowedReferers = Arrays.asList(refererConfig.split(","));}}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;String referer = httpServletRequest.getHeader("Referer");boolean isAllowed = false;if (Objects.isNull(referer)) {isAllowed = false;} else {for (String allowedReferer : allowedReferers) {if (referer.contains(allowedReferer)) {isAllowed = true;break;}}}if (isAllowed) {filterChain.doFilter(httpServletRequest, httpServletResponse);} else {httpServletResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied");}}@Overridepublic void destroy() {Filter.super.destroy();}
}
  1. 配置過濾器:在 Spring Boot 中注冊該過濾器。
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean<AntiLeachingFilter> filterRegistrationBean() {FilterRegistrationBean<AntiLeachingFilter> registration = new FilterRegistrationBean<>();registration.setFilter(new AntiLeachingFilter());registration.addInitParameter("allowedReferers", "127.0.0.1");registration.addUrlPatterns("/*");return registration;}}

基于令牌(Token)的防盜鏈

此方法為每個請求生成一個唯一的令牌,并在請求時驗證令牌的有效性。
以下是實現步驟和示例代碼:

  1. 創建令牌生成和驗證工具類:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Date;public class TokenGeneratorUtils {private static final String SECRET_KEY = "4t3t35y546yertdgsr3w4";/*** 生成用于防盜鏈的令牌(Token)。* 該方法通過將資源路徑、過期時間和密鑰拼接后進行 SHA-256 哈希計算,* 最終將計算得到的哈希值轉換為十六進制字符串作為令牌返回。** @param resourcePath  請求的資源路徑,用于標識具體要訪問的資源* @param expirationTime 令牌的過期時間,以毫秒為單位* @return 生成的令牌,是一個十六進制字符串*/public static String generateToken(String resourcePath, long expirationTime) {String date = resourcePath + expirationTime + SECRET_KEY;try {// 借助 MessageDigest.getInstance("SHA-256") 方法獲取一個 MessageDigest 實例,// 該實例使用的哈希算法為 SHA-256。SHA-256 屬于安全哈希算法,能夠將任意長度的輸入數據轉換為固定長度(256 位)的哈希值。MessageDigest digest = MessageDigest.getInstance("SHA-256");//調用 digest 方法對拼接后的字符串 data 進行哈希計算,返回一個字節數組 hash,此數組就是 data 的 SHA-256 哈希值。byte[] hash = digest.digest(date.getBytes());StringBuilder hexString = new StringBuilder();for (byte b : hash) {//字節轉換為對應的十六進制字符串。String hex = Integer.toHexString(0xff & b);if (hex.length() == 1) {//轉換后的十六進制字符串長度為 1,在前面補一個 0,以保證每個字節都用兩位十六進制數表示。hexString.append('0');}//轉換后的十六進制字符串追加到 hexString 中。hexString.append(hex);}return hexString.toString();} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e);}}public static boolean verifyToken(String resourcePath, String token, long expirationTime) {if (new Date().getTime() > expirationTime) {return false;}String generatedToken = generateToken(resourcePath, expirationTime);return generatedToken.equals(token);}}
  1. 創建控制器處理請求并驗證
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.Date;@RestController
@Slf4j
public class TestController {/*** curl --location '127.0.0.1:2223/test' \* --header 'Referer: 127.0.0.1'** header頭不傳合法的Referer 127.0.0.1則拒絕訪問* @return*/@RequestMapping("/test")public String test() {return "ok";}@GetMapping("/protectedResource")public ResponseEntity<String> getProtectedResource(@RequestParam String token, @RequestParam long expirationTime) {String resourcePath = "/protectedResource";if (TokenGeneratorUtils.verifyToken(resourcePath, token, expirationTime)) {return ResponseEntity.ok("Access granted");} else {return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Invalid token");}}public static void main(String[] args) {// 資源路徑String resourcePath = "/protectedResource";// 設置令牌過期時間,這里設置為當前時間往后 1 小時long expirationTime = new Date().getTime() + 3600 * 1000;// 生成令牌String token = TokenGeneratorUtils.generateToken(resourcePath, expirationTime);System.out.println(token);System.out.println(expirationTime);}
}

總結

  • 基于請求頭 Referer 的防盜鏈:實現簡單,但 Referer 字段容易被偽造。
  • 基于令牌(Token)的防盜鏈:安全性較高,但實現相對復雜,需要處理令牌的生成和驗證邏輯。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75996.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75996.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75996.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

悄悄話識別、 打電話識別、攀高識別三種識別算法

在攝像頭正對場景下,悄悄話識別(唇語識別)、打電話識別和攀高識別是三種典型的行為檢測技術。以下從技術原理、算法模型、應用場景及挑戰等方面進行詳細分析: 一、悄悄話識別(唇語識別) 技術原理 唇語識別通過分析嘴唇的幾何特征(形狀、開合程度、運動軌跡)和動態變化…

centos部署的openstack發布windows虛擬機

?CentOS上部署的OpenStack可以發布Windows虛擬機?。在CentOS上部署OpenStack后&#xff0c;可以通過OpenStack平臺創建和管理Windows虛擬機。以下是具體的步驟和注意事項&#xff1a; ?安裝和配置OpenStack?&#xff1a; 首先&#xff0c;確保系統滿足OpenStack的最低硬件…

【電子通識】案例:電纜的安裝方式也會影響設備的可靠性?

背景 在日常生活中&#xff0c;我們常常會忽略一些看似微不足道的細節&#xff0c;但這些細節有時卻能決定設備的壽命和安全性。比如&#xff0c;你知道嗎&#xff1f;一根電纜的布置方式&#xff0c;可能會決定你的設備是否會因為冷凝水而損壞。 今天&#xff0c;我們就來聊聊…

【Web APIs】JavaScript 操作多個元素 ④ ( 表格全選復選框案例 )

文章目錄 一、核心要點解析 - 表格全選復選框案例1、案例需求2、復選框設置3、獲取 全選復選框 和 普通復選框4、設置 全選復選框 邏輯5、設置 普通復選框 邏輯 二、完整代碼示例1、代碼示例2、執行結果 一、核心要點解析 - 表格全選復選框案例 1、案例需求 在表格中 , 設置 多…

OpenAI發布GPT-4.1系列模型——開發者可免費使用

OpenAI剛剛推出GPT-4.1模型家族&#xff0c;包含GPT-4.1、GPT-4.1 Mini和GPT-4.1 Nano三款模型。重點是——現在全部免費開放&#xff01; 雖然技術升級值得關注&#xff0c;但真正具有變革意義的是開發者能通過Cursor、Windsurf和GitHub Copilot等平臺立即免費調用這些模型。…

《重構全球貿易體系用戶指南》解讀

文章目錄 背景核心矛盾與理論框架美元的“特里芬難題”核心矛盾目標理論框架 政策工具箱的協同運作機制關稅體系的精準打擊匯率政策的混合干預安全工具的復合運用 實施路徑與全球秩序重構階段性目標 風險傳導與反制效應內部失衡加劇外部反制升級系統性風險 范式突破與理論再思考…

磁盤清理-C盤

0.采用的工具——WizTree&#xff08;一定要以管理員身份運行&#xff09; 沒有以管理員身份運行時&#xff1a; 以管理員身份運行&#xff1a;&#xff08;查出很多之前沒有查出的文件&#xff09; 1.該死的優酷&#xff01;緩存占我11個G的內存 2.C 盤 Dell 文件夾下的 SARe…

錨定“體驗驅動”,銳捷EDN讓園區網絡“以人為本”

作者 | 曾響鈴 文 | 響鈴說 傳統的網絡升級路徑&#xff0c;一如巴別塔的建造思路一般——工程師們按技術藍圖逐層堆砌&#xff0c;卻常與地面用戶的實際需求漸行漸遠&#xff0c;從而帶來了諸多體驗痛點&#xff0c;如手工配置效率低下、關鍵業務用網無法保障、網絡架構趨于…

pid_t

用最簡單的方式解釋&#xff1a; pid_t 就像是一個"專門用來裝進程號碼的盒子"。 實際本質&#xff1a; 這個盒子里面裝的是整數&#xff08;就像 int&#xff09;但給它貼了專用標簽&#xff0c;標明"只能裝進程ID" 為什么不用普通int&#xff1a; 就像…

如何處理Python爬取視頻時的反爬機制?

文章目錄 前言1. IP 封禁2. 驗證碼3. 用戶代理&#xff08;User-Agent&#xff09;檢測4. 動態內容加載5. 加密和簽名驗證 前言 在使用 Python 爬取視頻時&#xff0c;網站可能會設置多種反爬機制來阻止爬蟲&#xff0c;下面為你介紹一些常見反爬機制及對應的處理方法&#xf…

如何利用GM DC Monitor快速監控一臺網絡類設備

GM DC Monitor v2.0在網絡類設備監控的效率非常高&#xff01; 如果您需要管理運維大量的網絡類設備&#xff0c;GM DC Monitor是個不錯的選擇。 如果您具備一定的采集腳本編寫能力&#xff0c;可以在平臺的定制屬于自己的監控模板&#xff01; 1&#xff09;首先建立數據中…

特殊文件以及日志——特殊文件

一、特殊文件 必要性&#xff1a;可以用于存儲多個用戶的&#xff1a;用戶名、密碼。這些有關系的數據都可以用特殊文件來存儲&#xff0c;然后作為信息進行傳輸。 1. 屬性文件.properties&#xff08;鍵值對&#xff09; &#xff08;1&#xff09;特點&#xff1a; 都只能…

基于AD9767高速DAC的DDS信號發生器

DDS信號發生器原理 DDS控制信號發生原理圖 DDS主要由相位累加器、相位調制器、波形數據表以及D/A轉換器構成。其中相位累加器由N位加法器與N位寄存器構成。每個時鐘周期的時鐘上升沿,加法器就將頻率控制字與累加寄存器輸出的相位數據相加,相加的結果又反饋至累加寄存…

鏡像端口及觀察端口的配置

配好路由器的各個接口的IP PC1ping PC3的IP&#xff0c;在路由器中抓2/0/0端口的包&#xff0c;可觀察到無結果 輸入observe-port interface g 2/0/0 命令配置觀察端口 輸入mirror to observe-port both命令 &#xff08;其中both表示接收來去的數據包&#xff0c;inboun…

K8S_ResourceQuota與LimitRange的作用

ResourceQuota 作用詳解 資源總量控制&#xff1a;ResourceQuota能對命名空間內的資源使用總量進行限制。在一個Kubernetes集群中&#xff0c;存在多個命名空間&#xff0c;每個命名空間可看作一個獨立的工作單元。通過設置ResourceQuota&#xff0c;可以防止某個命名空間過度…

Redis之緩存擊穿

Redis之緩存擊穿 文章目錄 Redis之緩存擊穿一、什么是緩存擊穿二、緩存擊穿常見解決方案1. 互斥鎖&#xff08;Mutex Lock&#xff09;2. 永不過期 后臺刷新3. 邏輯過期&#xff08;異步更新&#xff09; 三、案例1.基于互斥鎖解決緩存擊穿2.基于邏輯過期解決緩存擊穿 四、注意…

Spring Boot 中使用 Netty

2025/4/15 向 一、什么是Netty Netty 是 Java 中一個非常高性能的網絡通信框架&#xff0c;用來開發服務器和客戶端程序&#xff0c;主要用于處理 TCP/UDP 的網絡連接&#xff0c;比如&#xff1a; 聊天服務 實時推送 高并發網絡通信&#xff08;比如游戲、IoT、金融系統&a…

【QT】 QT定時器的使用

QT定時器的使用 1. QTimer介紹&#xff08;1&#xff09;QTimer的使用方法步驟示例代碼1&#xff1a;定時器的啟動和關閉現象&#xff1a;示例代碼2&#xff1a;定時器每隔1s在標簽上切換圖片現象&#xff1a; (2)實際開發的作用 2.日期 QDate(1)主要方法 3.時間 QTime(1)主要方…

排序算法詳細介紹對比及備考建議

文章目錄 排序算法對比基本概要 算法逐一介紹1. 冒泡排序&#xff08;Bubble Sort&#xff09;2. 選擇排序&#xff08;Selection Sort&#xff09;3. 插入排序&#xff08;Insertion Sort&#xff09;&#x1f31f;&#x1f31f;4. 希爾排序&#xff08;Shell Sort&#xff09…

Docker華為云創建私人鏡像倉庫

Docker華為云創建私人鏡像倉庫 在華為云官網的 產品 中搜索 容器鏡像服務 &#xff1a; 或者在其他頁面的搜索欄中搜索 容器鏡像服務 &#xff1a; 進入到頁面后&#xff0c;點擊 創建組織 &#xff08;華為云的鏡像倉庫稱為組織&#xff09;&#xff1a; 設置組織名字后&…