成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用 Springboot + Nginx 的 http_secure_link_module 實現圖片防盜鏈在 Vue 展示

開發 前端
本次方案通過引入 Nginx 的 http_secure_link_module 模塊實現了圖片防盜鏈功能,增強了圖片資源的安全性。在配置方面,我們使用 Yaml 文件來管理關鍵配置信息,包括圖片域名和 Nginx 的安全鏈接密鑰。

使用 Springboot + Nginx 的 http_secure_link_module 實現圖片防盜鏈并在 Vue 中展示功能

在當今互聯網環境中,圖片資源的安全性和有效管理至關重要。為了防止未經授權的訪問和濫用圖片資源,我們采用 Nginx 的 http_secure_link_module 模塊來實現圖片防盜鏈功能。這不僅能保護圖片的合法使用,還能有效控制資源的訪問權限,提升系統的安全性和穩定性。

在本次配置中,我們對 secure_link 模塊進行了定制化的設置,以滿足特定的業務需求。通過引入 $remote_addr 變量,我們能夠更精確地控制訪問來源,進一步增強了防盜鏈的效果。同時,對密鑰的配置和 token 、過期時間的生成算法進行優化,確保了只有在合法條件下才能訪問圖片資源。

Nginx 配置(nginx.conf)

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;

    keepalive_timeout  65;

    # 啟用 secure_link 模塊
    server {
        listen 80;
        server_name  your_domain;

        # 私有密鑰配置
        secure_link_secret your_private_secret;  # 此處的密鑰是用于生成和驗證 token 的關鍵元素,需要妥善保管和保密。它參與了 MD5 哈希計算,確保 token 的唯一性和安全性。

        location /images {
            secure_link $arg_token,$arg_expires,$remote_addr;
            secure_link_md5 "$secure_link_secret$uri$arg_expires$remote_addr";  # 這個表達式詳細說明了如何根據密鑰、圖片的 URI、過期時間和客戶端的 IP 地址生成 MD5 哈希值,用于驗證請求的合法性。

            if ($secure_link = "") {  # 如果 token 為空,直接拒絕訪問,返回 403 禁止訪問狀態碼。
                return 403;
            }

            if ($secure_link = "0") {  # 如果 token 驗證失敗,返回 410 資源已不存在的狀態碼。
                return 410;
            }

            root /path/to/images;  # 指定圖片的實際存儲路徑,確保 Nginx 能夠正確找到并提供服務。
        }
    }
}

Pom.xml 依賴配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>image-security</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <properties>
        <java.version>11</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
            <version>1.33</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

Yaml 配置文件(application.yml)

image:
  domain: http://your_domain
nginx:
  secure-link-secret: your_secure_link_secret

ImageController 類(ImageController.java)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Controller;
import org.yaml.snakeyaml.Yaml;

import java.io.InputStream;
import java.util.Map;

@Controller
public class ImageController {

    @Autowired
    private Environment environment;

    public String generateImageUrl(String imageName) {
        String imageDomain = environment.getProperty("image.domain");
        // 生成過期時間(假設 1 小時后過期)
        LocalDateTime expirationTime = LocalDateTime.now().plusHours(1);
        long expiresInSeconds = expirationTime.toEpochSecond(ZoneOffset.UTC);

        // 生成 token
        String token = generateToken(imageName, expiresInSeconds);

        return imageDomain + "/images/" + imageName + "?token=" + token + "&expires=" + expiresInSeconds;
    }

    private String generateToken(String uri, long expires) {
        String secret = environment.getProperty("nginx.secure-link-secret");
        String data = uri + expires + secret;
        try {
            MessageDigest digest = MessageDigest.getInstance("MD5");
            byte[] hash = digest.digest(data.getBytes());
            return Base64.getUrlEncoder().encodeToString(hash);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }
}

Spring Boot 控制器生成圖片列表

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/image")
public class ImageController {

    @GetMapping("/list")
    public List<String> getImageList() {
        List<String> imageUrls = new ArrayList<>();
        imageUrls.add(generateImageUrl("image1.jpg"));
        imageUrls.add(generateImageUrl("image2.jpg"));
        // 此處根據實際邏輯生成帶有 token 和 expires 參數的圖片鏈接
        return imageUrls;
    }
}

Vue 中展示圖片列表

<template>
  <div>
    <ul>
      <li v-for="imageUrl in imageList" :key="imageUrl">
        <img :src="imageUrl" />
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      imageList: []
    };
  },
  mounted() {
    // 發送請求獲取圖片列表
    this.$http.get('/image/list')
     .then(response => {
        const imageDomain = '${process.env.VUE_APP_IMAGE_DOMAIN}';
        this.imageList = response.data.map(url => imageDomain + url);
      })
     .catch(error => {
        console.error('獲取圖片列表失敗', error);
      });
  }
};
</script>

總結

本次方案通過引入 Nginx 的 http_secure_link_module 模塊實現了圖片防盜鏈功能,增強了圖片資源的安全性。在配置方面,我們使用 Yaml 文件來管理關鍵配置信息,包括圖片域名和 Nginx 的安全鏈接密鑰。通過在 ImageController 類中讀取這些配置,生成帶有令牌和過期時間的圖片 URL。在 Vue 端,我們根據配置的域名來完整地構建圖片的訪問地址。整個方案具有良好的靈活性和可擴展性,能夠根據實際業務需求進行調整和優化,有效保護圖片資源的合法訪問和使用。

責任編輯:武曉燕 來源: 路條編程
相關推薦

2019-08-25 07:15:47

Nginx防盜鏈Linux

2017-03-22 14:41:43

2011-05-31 14:57:17

PHP盜鏈

2025-01-09 08:36:05

2020-06-15 09:41:47

網絡安全數據技術

2025-02-04 10:05:16

SpringForbiddenReferer?

2024-01-31 23:27:50

盜鏈Node.js

2020-09-01 16:56:58

華為云

2023-03-30 07:48:46

接口鑒權SpringBoot

2010-03-10 11:11:16

Python編程

2017-07-14 10:10:08

Vue.jsMixin

2009-09-28 13:23:54

HTTP編程

2024-02-19 16:25:29

前端Vue.jsJavaScript

2018-01-18 14:50:56

Nginx實現CDSW

2009-05-14 18:33:33

intelNehalem服務器

2022-11-01 11:55:27

ReactVue3

2020-01-14 09:40:00

Nginx負載均衡正向代理

2010-03-30 18:04:45

Nginx http服

2010-10-28 10:10:48

oracle存圖片

2009-12-18 08:40:21

TP-link家庭無線
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av性色全交蜜桃成熟时 | 日韩精品1区2区 | 一级黄在线观看 | 国产美女自拍视频 | 91爱啪啪| 天堂av资源| 中文字幕欧美一区 | 久久精品二区亚洲w码 | 日本黄色一级片视频 | 久久久久av | 国产成人福利视频 | 可以看黄的视频 | 亚洲一区综合 | 五月网婷婷 | 免费特级黄毛片 | 欧产日产国产精品视频 | 综合色在线 | 欧美亚洲日本 | www国产成人 | 国产精品自拍视频网站 | 欧美一区二区三区国产精品 | 久草新在线 | 久久久激情 | 欧美精品一区二区在线观看 | 亚洲aⅴ一区二区 | 麻豆91av| 精品99久久久久久 | 亚洲va在线va天堂va狼色在线 | 精品一区二区三区四区外站 | 欧美极品少妇xxxxⅹ免费视频 | 日本精品视频一区二区 | 亚洲精品免费看 | 福利久久 | 黄色三级在线播放 | 色综合久 | 综合成人在线 | 欧美午夜精品久久久久免费视 | 野狼在线社区2017入口 | 国产福利在线 | 免费a级毛片在线播放 | 国产精品网址 |