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

Nginx訪問FTP服務(wù)器文件的時效性/安全校驗的方法

 更新時間:2023年12月12日 09:23:39   作者:Code A Better Life  
nginx的實現(xiàn)方式在校驗失敗的時候頁面返回error image,跳轉(zhuǎn)的是420 error_page,成功的時候會訪問FTP文件服務(wù)器的路徑,反正圖片到頁面展示,這篇文章主要介紹了Nginx訪問FTP服務(wù)器文件的時效性/安全校驗,需要的朋友可以參考下

背景

FTP文件服務(wù)器在我們?nèi)粘i_發(fā)中經(jīng)常使用,在項目中我們經(jīng)常把FTP文件下載到內(nèi)存中,然后轉(zhuǎn)為base64給前端進行展示。如果excel中也需要導出圖片,數(shù)據(jù)量大的情況下會直接返回一個后端的開放接口地址,然后在項目中對接口的參數(shù)進行鑒權(quán),或者實效性檢驗等,最后從FTP下載圖片用流的方式傳到瀏覽器中。

但是這種方式會加大內(nèi)存的消耗,所有的文件相關(guān)的都在內(nèi)存中下載回傳給前端;報表下載的數(shù)據(jù)量很大的情況下服務(wù)很容易拖垮。所以就設(shè)想通過兩層nginx反向代理的方式是否可以滿足文件的直接訪問。

假設(shè)FTP文件服務(wù)器的照片存放地址為:/upload/signature

傳統(tǒng)實現(xiàn)

首先我們在下載excel的時候需要組裝一個url,如下所示的get請求就是一個對外開放無需權(quán)限的接口,真實情況下會對realFilePath進行加密組裝,里面放一些timestamp或者redis的key來驗證實效性、安全性等。

  @GetMapping("/signatureImage/{path}")
    public void signatureImage(@PathVariable("path") String realFilePath, HttpServletResponse response) throws IOException {
        //realFilePath = "/20231206/qhyu.png"
        String fileName = "qhyu.png"; //可以切割獲取。
        String path = "/upload/signature"; // 固定的存放路徑
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        try (Ftp ftp = new Ftp("Ftp_address", "Ftp_port", "username", "password")) {
            ftp.download(path+realFilePath, fileName, outputStream);
        } catch (Exception e) {
            log.error("FTP文件下載出錯:{}", e.getMessage());
            throw new QhyuException(MessageCode.FILE_DOENLOAD_ERROR.getCode());
        }
        // 將內(nèi)存中的文件內(nèi)容轉(zhuǎn)換為輸入流
        InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
        // 設(shè)置響應(yīng)的內(nèi)容類型為圖片格式
        String contentType = MediaType.IMAGE_PNG_VALUE; // 假設(shè)為PNG格式
        response.setContentType(contentType);
        org.apache.commons.io.IOUtils.copy(inputStream, response.getOutputStream());
        response.flushBuffer();
        // 關(guān)閉內(nèi)存流和FTP連接
        inputStream.close();
        outputStream.close();
    }

Nginx實現(xiàn)

要通過Nginx實現(xiàn)的話,基本上網(wǎng)上的方案都是讓使用lua。雖然可以但是沒必要。因為我從官網(wǎng)上找到了解決方案,如下所示。

在這里插入圖片描述

提供一下proxy相關(guān)參數(shù)的含義:

  • proxy_set_header Host $host;

此參數(shù)設(shè)置了將客戶端請求中的Host頭部信息傳遞給代理服務(wù)器。$host變量表示客戶端請求中的主機名。

  • proxy_intercept_errors on;

當啟用此參數(shù)時,代理服務(wù)器會攔截后端服務(wù)器返回的錯誤響應(yīng),并將其作為代理服務(wù)器的響應(yīng)返回給客戶端。這允許代理服務(wù)器處理后端服務(wù)器的錯誤響應(yīng),并可以進行自定義的錯誤處理。

  • proxy_set_header X-Real-IP $remote_addr;

此參數(shù)設(shè)置了將客戶端的真實IP地址傳遞給代理服務(wù)器。$remote_addr變量表示客戶端的IP地址。

  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

此參數(shù)設(shè)置了將客戶端的IP地址添加到X-Forwarded-For頭部信息中。$proxy_add_x_forwarded_for變量表示將客戶端IP地址添加到現(xiàn)有的X-Forwarded-For頭部信息中。

  • proxy_buffering off;

當啟用此參數(shù)時,禁用代理緩沖。代理緩沖可以在接收完整的響應(yīng)后再將其發(fā)送給客戶端,以提高性能和效率。禁用緩沖意味著代理服務(wù)器會立即將收到的數(shù)據(jù)發(fā)送給客戶端,適用于需要實時數(shù)據(jù)傳輸?shù)膱鼍啊?/p>

下面就是我的nginx配置:

    server {
        listen       10086;
        charset utf-8;
        access_log      /var/log/nginx/qhyu/qhyu_access.log;
        error_log      /var/log/nginx/qhyu/qhyu_error.log;
   location /verify {
        proxy_pass http://host:port/api/signatureImage/validate?realFilePath=$arg_realFilePath&signature=$arg_signature;
        proxy_set_header Host $host;
        proxy_intercept_errors on;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_buffering off;
        error_page 418 = @custom_redirect;
        error_page 420 = @custom_error;
     }
      location @custom_error{
        default_type application/json;
        return 200 'error image';
      }
      location @custom_redirect {
        rewrite ^ /signature/$arg_realFilePath last;
      }
      location /signature {
        alias /upload/signature/;
      }
}
}

然后就是編寫了一個接口,也就是在調(diào)用的時候可以訪問/verify接口帶上參數(shù),就會跳轉(zhuǎn)到這個接口進行校驗,如果返回的http狀態(tài)碼是418說明校驗通過,如果返回的是420說明校驗失敗。

@GetMapping("/signatureImage/validate")
    public Object signatureValidate(String realFilePath,String signature,HttpServletResponse httpServletResponse){
        String redisKey = AesEncryptUtil.decryption(signature);
        if (StrUtil.isBlank(redisKey)){
            httpServletResponse.setStatus(420);
            return RenderResult.success();
        }
        Object value = redisService.get(redisKey);
        if (value == null) {
            httpServletResponse.setStatus(420);
            return RenderResult.success();
        }
        List<String> signatureUrls = JSON.parseArray(JSON.toJSONString(value), String.class);
        if (signatureUrls == null || signatureUrls.isEmpty()){
            httpServletResponse.setStatus(420);
            return RenderResult.success();
        }
        if (!signatureUrls.contains(realFilePath)){
            httpServletResponse.setStatus(420);
            return RenderResult.success();
        }
        // greater than or equal to 300 should be passed to a client or be intercepted and redirected to nginx
        // for processing with the error_page directive
        // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors
        httpServletResponse.setStatus(418);
        return RenderResult.success();
    }

分析結(jié)果

nginx的實現(xiàn)方式在校驗失敗的時候頁面返回error image,跳轉(zhuǎn)的是420 error_page;成功的時候會訪問FTP文件服務(wù)器的路徑,反正圖片到頁面展示。在實際的開發(fā)過程中,外層可能還會有一個nginx反向代理,本文主要講解了一下如何使用這個方式對訪問的文件進行鑒權(quán)。

這樣做的好處就是不需要每個文件都下載到內(nèi)存然后使用流的方式傳輸,直接訪問的方式減少了后端服務(wù)的壓力,并且像頭像、簽名這種可能訪問頻繁的接口使用這種方式來處理是很棒的一種方式。

主要的思路就是拿到proxy_pass的返回信息,如果使用lua的話可以獲取到我們返回的body內(nèi)容,但是不使用lua的時候我們可以迂回處理,使用status code也一樣可以達到目的。

到此這篇關(guān)于Nginx訪問FTP服務(wù)器文件的時效性/安全校驗的文章就介紹到這了,更多相關(guān)Nginx訪問FTP服務(wù)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • nginx編譯安裝及常用參數(shù)詳解

    nginx編譯安裝及常用參數(shù)詳解

    這篇文章主要介紹了nginx編譯安裝及常用參數(shù)詳解,一種是基于ansible role實現(xiàn)編譯安裝nginx以及編譯安裝參數(shù)詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • 從Nginx切換到Tengine的步驟分享

    從Nginx切換到Tengine的步驟分享

    由淘寶網(wǎng)發(fā)起的Web服務(wù)器 Tengine 可以被看作一個更好的Nginx,或者是Nginx的超集。它在Nginx的基礎(chǔ)上,針對大訪問量網(wǎng)站的需求,添加了很多高級功能和特性
    2012-11-11
  • Nginx 通過ssl_trusted_certificate正確補全中間證書

    Nginx 通過ssl_trusted_certificate正確補全中間證書

    在 Nginx 配置 HTTPS 時,使用 ssl_trusted_certificate 指令可以指定受信任的 CA 證書鏈,用于驗證客戶端證書或 OCSP Stapling 等功能,正確補全中間證書鏈是確保 SSL/TLS 連接兼容性和安全性的關(guān)鍵,下面就來詳細的介紹一下如何使用,感興趣的可以了解一下
    2026-04-04
  • nginx日志中添加請求的response日志(推薦)

    nginx日志中添加請求的response日志(推薦)

    這篇文章主要介紹了nginx日志中添加請求的response日志,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-05-05
  • 服務(wù)器重啟后寶塔界面打開顯示404 nginx的解決方法

    服務(wù)器重啟后寶塔界面打開顯示404 nginx的解決方法

    在阿里云服務(wù)器搭建寶塔界面,服務(wù)器重啟之后打開寶塔顯示404 not found nginx,本文給大家介紹了服務(wù)器重啟后寶塔界面打開顯示404 nginx的解決方法,需要的朋友可以參考下
    2024-02-02
  • nginx實現(xiàn)發(fā)布靜態(tài)資源的方法

    nginx實現(xiàn)發(fā)布靜態(tài)資源的方法

    這篇文章主要介紹了nginx實現(xiàn)發(fā)布靜態(tài)資源的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Nginx反代Mogilefs分布式儲存示例詳解

    Nginx反代Mogilefs分布式儲存示例詳解

    這篇文章主要給大家介紹了關(guān)于Nginx反代Mogilefs分布式儲存的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Nginx具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • 使用Nginx搭建文件服務(wù)器的全過程

    使用Nginx搭建文件服務(wù)器的全過程

    文章介紹了選擇Nginx作為文件服務(wù)器的原因,包括其高性能、輕量級、高穩(wěn)定性等優(yōu)勢,以及Nginx的基本配置、高級配置和生產(chǎn)環(huán)境配置,文章還詳細介紹了如何使用Nginx進行HTTPS配置、防盜鏈配置、壓縮傳輸?shù)雀呒壒δ?需要的朋友可以參考下
    2026-01-01
  • nginx安裝及配置支持php的教程(全)

    nginx安裝及配置支持php的教程(全)

    本文的實驗環(huán)境為:Centos4.5,nginx版本為:nginx-0.7.26
    2013-02-02
  • nginx 匹配規(guī)則小總結(jié)(推薦)

    nginx 匹配規(guī)則小總結(jié)(推薦)

    這篇文章主要介紹了nginx 匹配規(guī)則小總結(jié)及nginx配置proxy_pass路徑帶/問題,需要的朋友可以參考下
    2018-07-07

最新評論

体育| 三河市| 奉节县| 集贤县| 庆云县| 天全县| 游戏| 浦东新区| 廉江市| 兰州市| 平泉县| 神木县| 海兴县| 永仁县| 焦作市| 永福县| 罗甸县| 梓潼县| 新河县| 津南区| 徐闻县| 广州市| 贺兰县| 昭觉县| 灌阳县| 吉水县| 论坛| 沐川县| 仲巴县| 马龙县| 淄博市| 玉环县| SHOW| 沅陵县| 纳雍县| 马关县| 保康县| 潜江市| 漾濞| 高阳县| 沂水县|