亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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)建攔截器類

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)建配置文件映射類

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)建攔截器類

import 上方2-2創(chuàng)建的類路徑.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)文章

  • Scala中的mkString的具體使用方法

    Scala中的mkString的具體使用方法

    這篇文章主要介紹了Scala中的mkString的具體方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • Java Map 通過(guò) key 或者 value 過(guò)濾的實(shí)例代碼

    Java Map 通過(guò) key 或者 value 過(guò)濾的實(shí)例代碼

    這篇文章主要介紹了Java Map 通過(guò) key 或者 value 過(guò)濾的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-06-06
  • Java中的線程ThreadLocal詳細(xì)解析

    Java中的線程ThreadLocal詳細(xì)解析

    這篇文章主要介紹了Java中的線程ThreadLocal詳細(xì)解析,ThreadLocal是線程本地變量,存儲(chǔ)在ThreadLocal里面的數(shù)據(jù)都是線程安全的,一般ThreadLocal適用的場(chǎng)景多是各個(gè)線程間沒(méi)有變量共享需要的同步問(wèn)題場(chǎng)景,需要的朋友可以參考下
    2023-10-10
  • java 中枚舉類enum的values()方法的詳解

    java 中枚舉類enum的values()方法的詳解

    這篇文章主要介紹了java 中枚舉類enum的values()方法的詳解的相關(guān)資料,希望通過(guò)本文大家能夠掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-09-09
  • java驗(yàn)證用戶是否已經(jīng)登錄 java實(shí)現(xiàn)自動(dòng)登錄

    java驗(yàn)證用戶是否已經(jīng)登錄 java實(shí)現(xiàn)自動(dòng)登錄

    這篇文章主要介紹了java驗(yàn)證用戶是否已經(jīng)登錄,java實(shí)現(xiàn)自動(dòng)登錄,感興趣的小伙伴們可以參考一下
    2016-04-04
  • springmvc實(shí)現(xiàn)文件上傳功能

    springmvc實(shí)現(xiàn)文件上傳功能

    這篇文章主要為大家詳細(xì)介紹了springmvc實(shí)現(xiàn)文件上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • java基于JSON實(shí)現(xiàn)前后端交互(附代碼)

    java基于JSON實(shí)現(xiàn)前后端交互(附代碼)

    本文主要介紹了java基于JSON實(shí)現(xiàn)前后端交互,通過(guò)實(shí)際代碼示例展示了如何前后端JSON交互,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Java實(shí)現(xiàn)字符串倒序輸出的四種方法匯總

    Java實(shí)現(xiàn)字符串倒序輸出的四種方法匯總

    這篇文章主要介紹了Java實(shí)現(xiàn)字符串倒序輸出的四種方法匯總,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Spring?MVC各種參數(shù)進(jìn)行封裝的方法實(shí)例

    Spring?MVC各種參數(shù)進(jìn)行封裝的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于Spring?MVC各種參數(shù)進(jìn)行封裝的相關(guān)資料,SpringMVC內(nèi)置多種數(shù)據(jù)類型轉(zhuǎn)換器,可以根據(jù)請(qǐng)求中的參數(shù)與后端控制器方法的參數(shù)的關(guān)系為我們實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)封裝,需要的朋友可以參考下
    2023-06-06
  • Java流程控制語(yǔ)句最全匯總(下篇)

    Java流程控制語(yǔ)句最全匯總(下篇)

    這篇文章主要介紹了Java流程控制語(yǔ)句最全匯總(下篇),本文章內(nèi)容詳細(xì),通過(guò)案例可以更好的理解數(shù)組的相關(guān)知識(shí),本模塊分為了三部分,本次為下篇,需要的朋友可以參考下
    2023-01-01

最新評(píng)論