最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、防盜鏈概念

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

二、防盜鏈原理

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

通過以上三種機(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. 時間限制驗(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)資源示例

將一個圖片文件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
    • 如果時間戳超時,返回 403 Forbidden: Timestamp Expired

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

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

相關(guān)文章

最新評論

兴城市| 阿城市| 普定县| 垫江县| 林口县| 静安区| 孟州市| 治多县| 泽州县| 宣城市| 成安县| 开江县| 偃师市| 揭阳市| 潜江市| 太康县| 沂源县| 综艺| 慈利县| 乌拉特中旗| 襄樊市| 东光县| 离岛区| 乐业县| 博爱县| 许昌县| 射洪县| 江油市| 灵寿县| 竹山县| 额尔古纳市| 通榆县| 新干县| 平邑县| 独山县| 湘阴县| 韩城市| 海城市| 高陵县| 万山特区| 临潭县|