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

SpringBoot實(shí)現(xiàn)圖片防盜鏈功能

 更新時(shí)間:2024年04月29日 08:26:43   作者:前阿里高級(jí)碼農(nóng)  
出于安全考慮,我們需要后端返回的圖片只允許在某個(gè)網(wǎng)站內(nèi)展示,不想被爬蟲(chóng)拿到圖片地址后被下載,或者,不想瀏覽器直接訪問(wèn)圖片鏈接,所以本文將給大家介紹SpringBoot實(shí)現(xiàn)圖片防盜鏈功能,需要的朋友可以參考下

前言

出于安全考慮,我們需要后端返回的圖片只允許在某個(gè)網(wǎng)站內(nèi)展示,不想被爬蟲(chóng)拿到圖片地址后被下載?;蛘?,不想瀏覽器直接訪問(wèn)圖片鏈接。

出于性能考慮,不想要?jiǎng)e人的網(wǎng)站,拿著我們的圖片鏈接去展示,白白消耗自己的服務(wù)器資源。

故而可在springboot中,使用簡(jiǎn)單的圖片防盜鏈規(guī)則。攔截掉一些處理。

1、代碼實(shí)現(xiàn)

本篇實(shí)戰(zhàn)代碼是簡(jiǎn)易版,代碼寫(xiě)死配置

1-1、創(chuàng)建攔截器類(lèi)

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse;
    public class ImageProtectionInterceptor implements HandlerInterceptor {    
       
        private static final 
       
        String ALLOWED_DOMAIN = "baidudu.com"; // 允許的域名    @Override    
        
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 
        
        throws Exception {        // 獲取請(qǐng)求的 URL        
      
        String requestUrl = request.getRequestURL().toString();        // 判斷請(qǐng)求是否以圖片后綴結(jié)尾        
      
        if (requestUrl.endsWith(".jpg") || requestUrl.endsWith(".png") || requestUrl.endsWith(".jpeg")) {            // 獲取請(qǐng)求的來(lái)源域名            
      
        String referer = request.getHeader("Referer");            // 檢查來(lái)源域名是否符合預(yù)期            
      
        if (referer != null && referer.contains(ALLOWED_DOMAIN)) {                
         
            return true; // 符合防盜鏈要求,放行請(qǐng)求            
           
            } else {                
         
            response.sendError(HttpServletResponse.SC_FORBIDDEN); // 返回 403 Forbidden                
         
            return false; // 攔截請(qǐng)求         
         
            }       
         
   }        
         
            return true; // 對(duì)非圖片資源請(qǐng)求放行  
            }
        
    }

2、代碼實(shí)現(xiàn)(靈活配置)

2-1、在 application.yml 中配置信息

# 圖片防盜鏈配置img-protect: 
# 圖片防盜鏈保護(hù)開(kāi)關(guān)  
enabled: true  
# 是否允許瀏覽器直接訪問(wèn)  
allowBrowser: false  
# 圖片防盜鏈白名單,多個(gè)用逗號(hào)分隔【不填則所有網(wǎng)站都攔截】 
allowReferer: baidudu.com

2-2、創(chuàng)建配置文件映射類(lèi)

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component@ConfigurationProperties("img-protect")

        public class ImgProtectConfig {    
          private boolean enabled;    
   
          private boolean allowBrowser;    
  
          private String allowReferer;    
  
          public boolean getEnabled() {        
           
               return enabled;    
        
    }    
    
          public void setEnabled(boolean enabled) {        
              
              this.enabled = enabled;   
              
              
          }    
              public boolean getAllowBrowser() {        
                  
                  return allowBrowser;   
                  
                  
              }   
              
         public void setAllowBrowser(boolean allowBrowser) {       
                 
            this.allowBrowser = allowBrowser;    
             
             
         }    
         
         public String getAllowReferer() {       
             
             return allowReferer;    
             
         }    
         
         public void setAllowReferer(String allowReferer) {        
             
             this.allowReferer = allowReferer;   
             
             
         }
            
        }

2-3、創(chuàng)建攔截器類(lèi)

import 上方2-2創(chuàng)建的類(lèi)路徑.ImgProtectConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

@Componentpublic 

class ImageProtectionInterceptor implements HandlerInterceptor {    
   
    @Autowired    
    
    private ImgProtectConfig imgProtectConfig;    
    
    @Override    
    
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  // 判斷是否開(kāi)啟圖片防盜鏈功能        
   
    if (!imgProtectConfig.getEnabled()){            
        
        return true;       
        
    }                // 獲取請(qǐng)求的 URL        
    
    String requestUrl = request.getRequestURL().toString();        // 判斷請(qǐng)求是否以圖片后綴結(jié)尾        
    
    if (requestUrl.endsWith(".jpg") || requestUrl.endsWith(".png") || requestUrl.endsWith(".jpeg")) {            // 獲取請(qǐng)求的來(lái)源域名            
    
    String referer = request.getHeader("Referer");            // 檢查來(lái)源域名是否符合預(yù)期,referer 為 null 則說(shuō)明是瀏覽器直接訪問(wèn)。            
    
    if (referer == null && imgProtectConfig.getAllowBrowser()){                
        
        return true; // 符合防盜鏈要求,放行請(qǐng)求            
        
        
    }else if (referer != null && isAllowedDomain(referer)) {                
        
    return true; // 符合防盜鏈要求,放行請(qǐng)求            
    
        
    } else {                
        
    response.sendError(HttpServletResponse.SC_FORBIDDEN); // 返回 403 Forbidden                
    
    return false; // 攔截請(qǐng)求           
        
         }       
    
    }        
    
    return true; // 對(duì)非圖片資源請(qǐng)求放行    
    
        
    }    // 檢查是否來(lái)自允許的域名    
    
    private boolean isAllowedDomain(String referer) {        
        
        // 獲取允許的域名        
        String allowedReferers = imgProtectConfig.getAllowReferer();        
        
        // 如果允許的域名不為空        
        if (allowedReferers.trim() != null && !"".equals(allowedReferers.trim())) {            
            
            // 將允許的域名分割成字符串?dāng)?shù)組            
        Set<String> allowedDomains = new HashSet<>(Arrays.asList(allowedReferers.split(",")));            
        
        // 遍歷允許的域名            
        for (String allowedDomain : allowedDomains) {                
        
        // 如果請(qǐng)求的域名包含允許的域名,則返回true                
        if (referer.contains(allowedDomain.trim())) {                    
            
            return true;               
            
            
        }           
        
            
        }      
        
            
        }        
        
        // 否則返回
        false        
        
        return false;    
        
    }
    
}

2-4、注冊(cè)攔截器

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration

    public class WebConfig implements WebMvcConfigurer {  
        
        // 不能再使用 new 方式創(chuàng)建對(duì)象 !!!  
        @Autowired    
         private ImageProtectionInterceptor imageProtectionInterceptor;   
        
        @Override    
        public void addInterceptors(InterceptorRegistry registry) {        
        
        // 注冊(cè)攔截器,攔截所有請(qǐng)求        
        registry.addInterceptor(imageProtectionInterceptor)                
        .addPathPatterns("/**"); 
        // 攔截所有請(qǐng)求    
        }
        
    }

結(jié)束語(yǔ)

以上防盜鏈攔截器基本實(shí)現(xiàn)可以對(duì)付一般情況下的圖片盜鏈,但并不能保證絕對(duì)安全。

可能出現(xiàn)以下等情況:

  • Referer 偽造: 惡意客戶端可以偽造 referer 頭。攻擊者可以偽造有效的 referer 來(lái)繞過(guò)保護(hù)。

  • 漏報(bào): 攻擊者可能找到繞過(guò) referer 檢查的方法(例如使用 data URI 或 base64 編碼的圖片)。

  • 誤報(bào): 合法用戶可能因?yàn)?referer 不匹配而被阻止(例如隱私瀏覽器或代理服務(wù)器)。

  • 反向代理: 攻擊者可以在url路徑中,添加域名白名單作為反向代理路徑,繞開(kāi)代碼的contains方法檢查。

以上就是SpringBoot實(shí)現(xiàn)圖片防盜鏈功能的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot圖片防盜鏈的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java泛型<T> T與T的使用方法詳解

    Java泛型<T> T與T的使用方法詳解

    這篇文章主要介紹了Java泛型<T> T與T的使用方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • java的各種集合為什么不安全(List、Set、Map)以及代替方案

    java的各種集合為什么不安全(List、Set、Map)以及代替方案

    這篇文章主要介紹了java的各種集合為什么不安全(List、Set、Map)以及代替方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 基于Map的computeIfAbsent的使用場(chǎng)景和使用方式

    基于Map的computeIfAbsent的使用場(chǎng)景和使用方式

    這篇文章主要介紹了基于Map的computeIfAbsent的使用場(chǎng)景和使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • MyBatis別名和settings設(shè)置方式

    MyBatis別名和settings設(shè)置方式

    這篇文章主要介紹了MyBatis別名和settings設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java8中Optional類(lèi)型和Kotlin中可空類(lèi)型的使用對(duì)比

    Java8中Optional類(lèi)型和Kotlin中可空類(lèi)型的使用對(duì)比

    這篇文章主要給大家介紹了關(guān)于Java8中Optional類(lèi)型和Kotlin中可空類(lèi)型的使用對(duì)比,文中通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • SpringMVC統(tǒng)一異常處理實(shí)例代碼

    SpringMVC統(tǒng)一異常處理實(shí)例代碼

    這篇文章主要介紹了SpringMVC統(tǒng)一異常處理實(shí)例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • java通過(guò)客戶端訪問(wèn)服務(wù)器webservice的方法

    java通過(guò)客戶端訪問(wèn)服務(wù)器webservice的方法

    這篇文章主要介紹了java通過(guò)客戶端訪問(wèn)服務(wù)器webservice的方法,涉及java創(chuàng)建與調(diào)用webservice的相關(guān)技巧,需要的朋友可以參考下
    2016-08-08
  • 簡(jiǎn)單說(shuō)說(shuō)JVM堆區(qū)的相關(guān)知識(shí)

    簡(jiǎn)單說(shuō)說(shuō)JVM堆區(qū)的相關(guān)知識(shí)

    今天給大家?guī)?lái)的是關(guān)于Java虛擬機(jī)的相關(guān)知識(shí),文章圍繞著JVM堆區(qū)展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Spring?Cloud集成Nacos?Config動(dòng)態(tài)刷新源碼剖析

    Spring?Cloud集成Nacos?Config動(dòng)態(tài)刷新源碼剖析

    這篇文章主要為大家介紹了Spring?Cloud集成Nacos?Config動(dòng)態(tài)刷新源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • org.slf4j.Logger中info()方法的使用詳解

    org.slf4j.Logger中info()方法的使用詳解

    這篇文章主要介紹了org.slf4j.Logger中info()方法的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評(píng)論

河池市| 乌鲁木齐县| 阜阳市| 迁西县| 余干县| 绿春县| 甘泉县| 兴安盟| 永清县| 宜昌市| 宁海县| 阳泉市| 喀喇| 永嘉县| 康平县| 航空| 青铜峡市| 济宁市| 霍林郭勒市| 沾化县| 大余县| 顺义区| 永年县| 涟源市| 莫力| 都昌县| 昌黎县| 荥阳市| 获嘉县| 江达县| 东光县| 彭山县| 祁连县| 正安县| 洛川县| 长乐市| 黑水县| 通海县| 池州市| 上栗县| 建宁县|