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

基于SpringBoot實(shí)現(xiàn)圖片防盜鏈的兩種方式

 更新時(shí)間:2025年02月06日 09:49:23   作者:救救孩子把  
出于安全和性能的考慮,我們希望服務(wù)器返回的圖片資源僅在指定網(wǎng)站內(nèi)展示,防止爬蟲或其它站點(diǎn)直接引用圖片地址進(jìn)行下載或展示,進(jìn)而消耗服務(wù)器資源,所以本文給大家介紹了基于SpringBoot實(shí)現(xiàn)圖片防盜鏈的兩種方式,需要的朋友可以參考下

1. 實(shí)現(xiàn)目的

出于安全和性能的考慮,我們希望服務(wù)器返回的圖片資源僅在指定網(wǎng)站內(nèi)展示,防止爬蟲或其它站點(diǎn)直接引用圖片地址進(jìn)行下載或展示,進(jìn)而消耗服務(wù)器資源。簡單來說,即在請(qǐng)求圖片時(shí)通過檢查 HTTP 請(qǐng)求頭中的 Referer 來判斷請(qǐng)求來源是否合法。

2. 簡易實(shí)現(xiàn)方案

2.1 攔截器基本實(shí)現(xiàn)

在第一種方案中,代碼寫死了允許訪問的域名(例如 “baidudu.com”),主要步驟如下:

  • 判斷 URL 后綴
    當(dāng)請(qǐng)求 URL 以 “.jpg”、“.png”、“.jpeg” 等圖片格式結(jié)尾時(shí),再進(jìn)行后續(xù)判斷。

  • 檢查 Referer
    從請(qǐng)求頭中取出 Referer,若不為空且包含預(yù)設(shè)允許的域名,則放行;否則返回 403 錯(cuò)誤碼,從而拒絕訪問。

例如:

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    String requestUrl = request.getRequestURL().toString();
    if (requestUrl.endsWith(".jpg") || requestUrl.endsWith(".png") || requestUrl.endsWith(".jpeg")) {
        String referer = request.getHeader("Referer");
        if (referer != null && referer.contains("baidudu.com")) {
            return true;
        } else {
            response.sendError(HttpServletResponse.SC_FORBIDDEN);
            return false;
        }
    }
    return true;
}

注冊(cè)攔截器時(shí),采用 Spring Boot 的 WebMvcConfigurer 接口將該攔截器應(yīng)用于所有請(qǐng)求路徑。

3. 靈活配置實(shí)現(xiàn)方案

為了使防盜鏈的配置更加靈活,可以將配置項(xiàng)(例如是否開啟防盜鏈、是否允許瀏覽器直接訪問、白名單域名等)寫在 application.yml 中,并利用配置類映射到 Java 對(duì)象中。

3.1 配置文件示例

在 application.yml 中定義如下配置:

img-protect:
  enabled: true
  allowBrowser: false
  allowReferer: baidudu.com

3.2 映射配置類

利用 @ConfigurationProperties 將配置項(xiàng)映射到 Java 類中,方便后續(xù)使用:

@Component
@ConfigurationProperties("img-protect")
public class ImgProtectConfig {
    private boolean enabled;
    private boolean allowBrowser;
    private String allowReferer;
    // getter/setter 略
}

3.3 攔截器實(shí)現(xiàn)細(xì)節(jié)

在新版攔截器中,通過注入上述配置類,實(shí)現(xiàn)如下邏輯:

  • 若防盜鏈功能未開啟,則直接放行。
  • 對(duì)圖片資源請(qǐng)求(通過 URL 后綴判斷):
    • 如果 Referer 為空且允許瀏覽器直接訪問(allowBrowser 為 true),則放行;
    • 如果 Referer 不為空,則調(diào)用輔助方法判斷 Referer 是否包含配置中允許的域名(允許多個(gè)域名,逗號(hào)分隔);
    • 否則返回 403。

例如:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    if (!imgProtectConfig.getEnabled()){
        return true;
    }
    String requestUrl = request.getRequestURL().toString();
    if (requestUrl.endsWith(".jpg") || requestUrl.endsWith(".png") || requestUrl.endsWith(".jpeg")) {
        String referer = request.getHeader("Referer");
        if (referer == null && imgProtectConfig.getAllowBrowser()){
            return true;
        } else if (referer != null && isAllowedDomain(referer)) {
            return true;
        } else {
            response.sendError(HttpServletResponse.SC_FORBIDDEN);
            return false;
        }
    }
    return true;
}

其中 isAllowedDomain 方法遍歷配置中允許的多個(gè)域名進(jìn)行比對(duì)。

4. 注意事項(xiàng)及局限性

雖然這種通過檢查 Referer 實(shí)現(xiàn)的防盜鏈功能在一般場(chǎng)景下能有效防止資源被盜用,但仍存在一些不足之處:

  • Referer 偽造:惡意客戶端可以偽造 Referer 頭信息,繞過檢測(cè)。
  • 漏報(bào)問題:攻擊者可能利用 data URI 或 Base64 編碼等方式繞過檢查。
  • 誤報(bào)問題:部分合法用戶(例如使用隱私瀏覽器或代理服務(wù)器時(shí))可能因 Referer 不匹配而被誤攔截。
  • 反向代理問題:攻擊者可能利用反向代理手法,通過 URL 路徑中加入白名單域名繞過 contains 判斷。

因此,該方法只是基本防護(hù)手段,并不能保證絕對(duì)安全,實(shí)際應(yīng)用中可結(jié)合更嚴(yán)格的安全措施(如 Token 驗(yàn)證、Nginx 防盜鏈等)來共同提升防護(hù)效果。

5. 總結(jié)

本文展示了兩種基于 Spring Boot 實(shí)現(xiàn)圖片防盜鏈的方式:

  1. 簡單寫死配置的方式,直接在攔截器中判斷 Referer;
  2. 基于配置文件靈活配置的方式,通過 application.yml 配置防盜鏈參數(shù),并在攔截器中使用。

雖然這種方法能對(duì)一般情況下的盜鏈行為起到一定防護(hù)作用,但考慮到 Referer 可偽造等問題,實(shí)際項(xiàng)目中還需根據(jù)具體場(chǎng)景綜合考慮更全面的安全策略。

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

相關(guān)文章

  • SpringBoot項(xiàng)目中@Test不出現(xiàn)可點(diǎn)擊運(yùn)行的按鈕問題

    SpringBoot項(xiàng)目中@Test不出現(xiàn)可點(diǎn)擊運(yùn)行的按鈕問題

    這篇文章主要介紹了SpringBoot項(xiàng)目中@Test不出現(xiàn)可點(diǎn)擊運(yùn)行的按鈕問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 詳解IDEA中類加載器調(diào)用getResourceAsStream()方法需注意的問題

    詳解IDEA中類加載器調(diào)用getResourceAsStream()方法需注意的問題

    這篇文章主要介紹了詳解IDEA中類加載器調(diào)用getResourceAsStream()方法需注意的問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • springmvc請(qǐng)求參數(shù)的綁定的項(xiàng)目實(shí)踐

    springmvc請(qǐng)求參數(shù)的綁定的項(xiàng)目實(shí)踐

    本文主要介紹了springmvc請(qǐng)求參數(shù)的綁定的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • 字符編碼的處理和BeanUtils組件使用詳解

    字符編碼的處理和BeanUtils組件使用詳解

    這篇文章主要為大家介紹了字符編碼的處理和BeanUtils組件的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • elasticsearch集群cluster主要功能詳細(xì)分析

    elasticsearch集群cluster主要功能詳細(xì)分析

    這篇文章主要為大家介紹了elasticsearch集群cluster主要功能詳細(xì)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • 淺述int與string類型轉(zhuǎn)換的兩種方法

    淺述int與string類型轉(zhuǎn)換的兩種方法

    這篇文章主要介紹了Java中int與string類型轉(zhuǎn)換的兩種方法的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • java登錄驗(yàn)證碼實(shí)現(xiàn)代碼

    java登錄驗(yàn)證碼實(shí)現(xiàn)代碼

    這篇文章介紹了java實(shí)現(xiàn)登錄驗(yàn)證碼:用興趣的同學(xué)可以參考一下
    2013-10-10
  • Windows10系統(tǒng)下JDK1.8環(huán)境變量的配置

    Windows10系統(tǒng)下JDK1.8環(huán)境變量的配置

    今天帶大家學(xué)習(xí)在Windows10系統(tǒng)下怎么配置JDK1.8環(huán)境變量,文中有非常詳細(xì)的安裝及配置教程,對(duì)正在學(xué)習(xí)的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Java使用Swagger接口框架方法詳解

    Java使用Swagger接口框架方法詳解

    這篇文章主要介紹了Java使用Swagger接口框架方法,Swagger是一個(gè)方便我們更好的編寫API文檔的框架,而且Swagger可以模擬http請(qǐng)求調(diào)用,感興趣的同學(xué)可以參考下文
    2023-05-05
  • java中的內(nèi)部類詳細(xì)總結(jié)

    java中的內(nèi)部類詳細(xì)總結(jié)

    內(nèi)部類不是很好理解,但說白了其實(shí)也就是一個(gè)類中還包含著另外一個(gè)類。如同一個(gè)人是由大腦、肢體、器官等身體結(jié)果組成,而內(nèi)部類相當(dāng)于其中的某個(gè)器官之一,例如心臟:它也有自己的屬性和行為(血液、跳動(dòng))
    2013-10-10

最新評(píng)論

台中县| 佛坪县| 扎兰屯市| 烟台市| 措美县| 蒙山县| 额尔古纳市| 神池县| 开江县| 石阡县| 宣威市| 堆龙德庆县| 洞头县| 临安市| 宁安市| 阿拉善左旗| 句容市| 和顺县| 井陉县| 晋宁县| 桂东县| 潜山县| 鄂托克前旗| 军事| 贡觉县| 饶平县| 长兴县| 新绛县| 广州市| 敦化市| 天门市| 阿拉善盟| 宝兴县| 呼玛县| 昭通市| 永安市| 云浮市| 沙田区| 上饶县| 连云港市| 临高县|