亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于SpringBoot實現(xiàn)防盜鏈功能

 更新時間:2024年12月16日 17:11:05   作者:HBLOG  
防盜鏈是保護資源服務器的常用方法,旨在防止未經授權的外部鏈接直接訪問服務器上的資源,如圖片、音頻和視頻文件,在本文中,我們將探討防盜鏈的概念和原理,并結合 Spring Boot 提供一個完整的可運行示例,需要的朋友可以參考下

一、防盜鏈概念

防盜鏈是一種通過限制資源訪問來源的技術,通常通過檢查 HTTP 請求頭中的 Referer 字段來實現(xiàn)。如果請求的來源不是允許的域名,則拒絕該請求。除此之外,還可以結合 Token 和時間戳進一步提高安全性,確保鏈接只能在一定時間內有效。

二、防盜鏈原理

  • Referer 校驗
    • HTTP Referer 是瀏覽器在發(fā)送請求時附加的字段,用于標明請求的來源頁面。
    • 服務器可以通過檢查 Referer 是否屬于信任的域名,拒絕其他來源的訪問請求。
  • Token 驗證
    • 服務器為合法請求生成帶簽名的訪問鏈接(包含 Token),客戶端訪問時攜帶該 Token。
    • 服務器通過驗證 Token 是否正確來判斷請求合法性。
  • 時間限制
    • 通過在請求中附帶時間戳參數(shù),限制鏈接的有效期。
    • 服務器校驗請求的時間戳與當前時間的差值,超出范圍的請求將被拒絕。

通過以上三種機制,可以顯著提高資源防盜鏈的安全性。

三、項目結構

以下是示例項目的目錄結構:

src
├── main
│   ├── java
│   │   └── com.demo
│   │       ├── DemoApplication.java
│   │       ├── filter
│   │       │   ├── StaticResourceFilter.java
│   │       │   ├── TokenValidator.java
│   │       │   └── TimeValidator.java
│   └── resources
│       └── static
│           └── images
                     └──711815.jpeg

四、核心代碼實現(xiàn)

1. 主應用程序入口

package com.et;

import com.et.filter.StaticResourceFilter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class DemoApplication {

   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
   @Bean
   public FilterRegistrationBean<StaticResourceFilter> staticResourceFilter() {
      FilterRegistrationBean<StaticResourceFilter> registrationBean = new FilterRegistrationBean<>();
      registrationBean.setFilter(new StaticResourceFilter());
      registrationBean.addUrlPatterns("/images/*");
      return registrationBean;
   }
}

2. 靜態(tài)資源訪問過濾器

package com.et.filter;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
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;

public class StaticResourceFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        // validate Referer
        String referer = httpRequest.getHeader("Referer");
        String allowedDomain = "http://localhost:8088";
        if (referer == null || !referer.startsWith(allowedDomain)) {
            httpResponse.getWriter().write("403 Forbidden: Hotlinking not allowed");
            return;
        }

        // validate Token
        if (!TokenValidator.validateToken(httpRequest, httpResponse)) {
            return;
        }

        // validate Timestamp
        if (!TimeValidator.validateTimestamp(httpRequest, httpResponse)) {
            return;
        }

        chain.doFilter(request, response);
    }
}

3. Token 驗證工具

package com.et.filter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class TokenValidator {

    public static boolean validateToken(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String token = request.getParameter("token");
        String validToken = "your-predefined-token"; //set your predefined token here

        if (token == null || !token.equals(validToken)) {
            response.getWriter().write("403 Forbidden: Invalid Token");
            return false;
        }

        return true;
    }
}

4. 時間限制驗證工具

package com.et.filter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.time.Instant;

public class TimeValidator {

    private static final long ALLOWED_TIME_DIFF = 300; // offset in seconds( 300 seconds)

    public static boolean validateTimestamp(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String timestampStr = request.getParameter("timestamp");

        if (timestampStr == null) {
            response.getWriter().write("403 Forbidden: Missing Timestamp");
            return false;
        }

        try {
            long timestamp = Long.parseLong(timestampStr);
            long currentTimestamp = Instant.now().getEpochSecond();

            if (Math.abs(currentTimestamp - timestamp) > ALLOWED_TIME_DIFF) {
                response.getWriter().write("403 Forbidden: Timestamp Expired");
                return false;
            }
        } catch (NumberFormatException e) {
            response.getWriter().write("403 Forbidden: Invalid Timestamp");
            return false;
        }

        return true;
    }
}

5. 靜態(tài)資源示例

將一個圖片文件711815.jpeg 放入 src/main/resources/static/images 文件夾中。

以上只是一些關鍵代碼。

五、測試方式

  • 啟動 Spring Boot 項目。

  • 測試訪問圖片資源:

curl -X GET "http://localhost:8088/static/example.jpg?token=your-predefined-token&timestamp=$(date +%s)" -H "Referer: http://localhost:8088"
  • 檢查以下情況:

    • 如果 Referer 不正確,返回 403 Forbidden: Hotlinking not allowed。
    • 如果 Token 無效,返回 403 Forbidden: Invalid Token。
    • 如果時間戳超時,返回 403 Forbidden: Timestamp Expired。

通過本文,您可以了解如何通過 Referer 校驗、Token 驗證和時間限制實現(xiàn)資源防盜鏈保護。如果有其他問題或需求,歡迎進一步探討!

到此這篇關于基于SpringBoot實現(xiàn)防盜鏈功能的文章就介紹到這了,更多相關SpringBoot防盜鏈內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • springboot 1.5.2 集成kafka的簡單例子

    springboot 1.5.2 集成kafka的簡單例子

    本篇文章主要介紹了springboot 1.5.2 集成kafka的簡單例子 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • MyBatis逆向工程的創(chuàng)建和使用

    MyBatis逆向工程的創(chuàng)建和使用

    這篇文章主要介紹了MyBatis逆向工程的創(chuàng)建和使用,需要的朋友可以參考下
    2017-08-08
  • java實現(xiàn)傾斜水印鋪滿整張圖

    java實現(xiàn)傾斜水印鋪滿整張圖

    這篇文章主要為大家詳細介紹了java實現(xiàn)傾斜水印鋪滿整張圖的具體代碼,教大家如何控制水印之間的空隙,感興趣的小伙伴們可以參考一下
    2016-06-06
  • gateway和jwt網關認證實現(xiàn)過程解析

    gateway和jwt網關認證實現(xiàn)過程解析

    這篇文章主要介紹了gateway和jwt網關認證實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • Java Stream 流實現(xiàn)合并操作示例

    Java Stream 流實現(xiàn)合并操作示例

    這篇文章主要介紹了Java Stream 流實現(xiàn)合并操作,結合實例形式詳細分析了Java Stream 流實現(xiàn)合并操作原理與相關注意事項,需要的朋友可以參考下
    2020-05-05
  • SpringBoot如何讀取xml配置bean(@ImportResource)

    SpringBoot如何讀取xml配置bean(@ImportResource)

    這篇文章主要介紹了SpringBoot如何讀取xml配置bean(@ImportResource),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 詳解java關于對象的比較

    詳解java關于對象的比較

    這篇文章主要為大家介紹了java關于對象的比較,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • java字符串求并集的方法

    java字符串求并集的方法

    這篇文章主要介紹了java字符串求并集的方法,涉及Java字符串操作中union方法的使用,是Java字符串操作中非常實用的基本技巧,需要的朋友可以參考下
    2014-11-11
  • Spring框架概述及核心設計思想分享

    Spring框架概述及核心設計思想分享

    Spring框架是一種開源的Java企業(yè)級應用開發(fā)框架,提供了IoC(控制反轉)容器和DI(依賴注入)等核心設計思想,SpringBoot則是在Spring基礎上進一步簡化配置,提供了快速開發(fā)、內置服務器等功能,學習Spring框架需要掌握容器、IoC和DI等概念,以及分層設計等軟件工程思想
    2025-02-02
  • Kafka是什么及如何使用SpringBoot對接Kafka(最新推薦)

    Kafka是什么及如何使用SpringBoot對接Kafka(最新推薦)

    這篇文章主要介紹了Kafka是什么,以及如何使用SpringBoot對接Kafka,今天我們通過一個Demo講解了在SpringBoot中如何對接Kafka,也介紹了下關鍵類?KafkaTemplate,需要的朋友可以參考下
    2023-11-11

最新評論