欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2024年12月16日 17:11:05   作者:HBLOG  
防盜鏈?zhǔn)潜Wo(hù)資源服務(wù)器的常用方法,旨在防止未經(jīng)授權(quán)的外部鏈接直接訪問服務(wù)器上的資源,如圖片、音頻和視頻文件,在本文中,我們將探討防盜鏈的概念和原理,并結(jié)合 Spring Boot 提供一個(gè)完整的可運(yùn)行示例,需要的朋友可以參考下

一、防盜鏈概念

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

二、防盜鏈原理

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

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

三、項(xiàng)目結(jié)構(gòu)

以下是示例項(xiàng)目的目錄結(jié)構(gòu):

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

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

1. 主應(yīng)用程序入口

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 驗(yàn)證工具

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. 時(shí)間限制驗(yàn)證工具

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)資源示例

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

以上只是一些關(guān)鍵代碼。

五、測試方式

  • 啟動 Spring Boot 項(xiàng)目。

  • 測試訪問圖片資源:

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
    • 如果時(shí)間戳超時(shí),返回 403 Forbidden: Timestamp Expired

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

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

相關(guān)文章

  • springboot 1.5.2 集成kafka的簡單例子

    springboot 1.5.2 集成kafka的簡單例子

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

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

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

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

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

    gateway和jwt網(wǎng)關(guān)認(rèn)證實(shí)現(xiàn)過程解析

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

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

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

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

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

    詳解java關(guān)于對象的比較

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

    java字符串求并集的方法

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

    Spring框架概述及核心設(shè)計(jì)思想分享

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

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

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

最新評論