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

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

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

前言

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

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

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

1、代碼實現(xiàn)

本篇實戰(zhàn)代碼是簡易版,代碼寫死配置

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 {        // 獲取請求的 URL        
      
        String requestUrl = request.getRequestURL().toString();        // 判斷請求是否以圖片后綴結(jié)尾        
      
        if (requestUrl.endsWith(".jpg") || requestUrl.endsWith(".png") || requestUrl.endsWith(".jpeg")) {            // 獲取請求的來源域名            
      
        String referer = request.getHeader("Referer");            // 檢查來源域名是否符合預(yù)期            
      
        if (referer != null && referer.contains(ALLOWED_DOMAIN)) {                
         
            return true; // 符合防盜鏈要求,放行請求            
           
            } else {                
         
            response.sendError(HttpServletResponse.SC_FORBIDDEN); // 返回 403 Forbidden                
         
            return false; // 攔截請求         
         
            }       
         
   }        
         
            return true; // 對非圖片資源請求放行  
            }
        
    }

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

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

# 圖片防盜鏈配置img-protect: 
# 圖片防盜鏈保護開關(guān)  
enabled: true  
# 是否允許瀏覽器直接訪問  
allowBrowser: false  
# 圖片防盜鏈白名單,多個用逗號分隔【不填則所有網(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 {  // 判斷是否開啟圖片防盜鏈功能        
   
    if (!imgProtectConfig.getEnabled()){            
        
        return true;       
        
    }                // 獲取請求的 URL        
    
    String requestUrl = request.getRequestURL().toString();        // 判斷請求是否以圖片后綴結(jié)尾        
    
    if (requestUrl.endsWith(".jpg") || requestUrl.endsWith(".png") || requestUrl.endsWith(".jpeg")) {            // 獲取請求的來源域名            
    
    String referer = request.getHeader("Referer");            // 檢查來源域名是否符合預(yù)期,referer 為 null 則說明是瀏覽器直接訪問。            
    
    if (referer == null && imgProtectConfig.getAllowBrowser()){                
        
        return true; // 符合防盜鏈要求,放行請求            
        
        
    }else if (referer != null && isAllowedDomain(referer)) {                
        
    return true; // 符合防盜鏈要求,放行請求            
    
        
    } else {                
        
    response.sendError(HttpServletResponse.SC_FORBIDDEN); // 返回 403 Forbidden                
    
    return false; // 攔截請求           
        
         }       
    
    }        
    
    return true; // 對非圖片資源請求放行    
    
        
    }    // 檢查是否來自允許的域名    
    
    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) {                
        
        // 如果請求的域名包含允許的域名,則返回true                
        if (referer.contains(allowedDomain.trim())) {                    
            
            return true;               
            
            
        }           
        
            
        }      
        
            
        }        
        
        // 否則返回
        false        
        
        return false;    
        
    }
    
}

2-4、注冊攔截器

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)建對象 !!!  
        @Autowired    
         private ImageProtectionInterceptor imageProtectionInterceptor;   
        
        @Override    
        public void addInterceptors(InterceptorRegistry registry) {        
        
        // 注冊攔截器,攔截所有請求        
        registry.addInterceptor(imageProtectionInterceptor)                
        .addPathPatterns("/**"); 
        // 攔截所有請求    
        }
        
    }

結(jié)束語

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

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

  • Referer 偽造: 惡意客戶端可以偽造 referer 頭。攻擊者可以偽造有效的 referer 來繞過保護。

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

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

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

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

相關(guān)文章

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

    Scala中的mkString的具體使用方法

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

    Java Map 通過 key 或者 value 過濾的實例代碼

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

    Java中的線程ThreadLocal詳細解析

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評論