国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價值的文章主要介紹了Nginx訪問FTP服務(wù)器文件的時效性/安全校驗。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

背景

FTP文件服務(wù)器在我們?nèi)粘i_發(fā)中經(jīng)常使用,在項目中我們經(jīng)常把FTP文件下載到內(nèi)存中,然后轉(zhuǎn)為base64給前端進(jìn)行展示。如果excel中也需要導(dǎo)出圖片,數(shù)據(jù)量大的情況下會直接返回一個后端的開放接口地址,然后在項目中對接口的參數(shù)進(jìn)行鑒權(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進(jìn)行加密組裝,里面放一些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)上找到了解決方案,如下所示。
Nginx訪問FTP服務(wù)器文件的時效性/安全校驗,nginx,nginx,服務(wù)器,安全,spring,java,后端,運(yùn)維

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

  1. proxy_set_header Host $host;
    此參數(shù)設(shè)置了將客戶端請求中的Host頭部信息傳遞給代理服務(wù)器。$host變量表示客戶端請求中的主機(jī)名。
  2. proxy_intercept_errors on;
    當(dāng)啟用此參數(shù)時,代理服務(wù)器會攔截后端服務(wù)器返回的錯誤響應(yīng),并將其作為代理服務(wù)器的響應(yīng)返回給客戶端。這允許代理服務(wù)器處理后端服務(wù)器的錯誤響應(yīng),并可以進(jìn)行自定義的錯誤處理。
  3. proxy_set_header X-Real-IP $remote_addr;
    此參數(shù)設(shè)置了將客戶端的真實IP地址傳遞給代理服務(wù)器。$remote_addr變量表示客戶端的IP地址。
  4. 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頭部信息中。
  5. proxy_buffering off;
    當(dāng)啟用此參數(shù)時,禁用代理緩沖。代理緩沖可以在接收完整的響應(yīng)后再將其發(fā)送給客戶端,以提高性能和效率。禁用緩沖意味著代理服務(wù)器會立即將收到的數(shù)據(jù)發(fā)送給客戶端,適用于需要實時數(shù)據(jù)傳輸?shù)膱鼍啊?/li>

下面就是我的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)到這個接口進(jì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反向代理,本文主要講解了一下如何使用這個方式對訪問的文件進(jìn)行鑒權(quán)。

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

主要的思路就是拿到proxy_pass的返回信息,如果使用lua的話可以獲取到我們返回的body內(nèi)容,但是不使用lua的時候我們可以迂回處理,使用status code也一樣可以達(dá)到目的。文章來源地址http://www.zghlxwxcb.cn/news/detail-755264.html

到了這里,關(guān)于Nginx訪問FTP服務(wù)器文件的時效性/安全校驗的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 匿名訪問ftp服務(wù)器

    匿名訪問ftp服務(wù)器

    我們啟用ftp服務(wù),想要上傳或者下載遠(yuǎn)程文件時,存在著匿名訪問ftp服務(wù)器問題。 通常,我們使用網(wǎng)頁直接進(jìn)入ftp服務(wù)器時,可以選擇以匿名登錄的方式訪問ftp服務(wù)器,此時一般不會出現(xiàn)需要填寫用戶名和密碼的問題,并且在網(wǎng)頁狀態(tài)下,我們不能上傳文件。 比如,進(jìn)入到

    2024年02月04日
    瀏覽(22)
  • FastDFS+Nginx - 本地搭建文件服務(wù)器同時實現(xiàn)在外遠(yuǎn)程訪問「端口映射」

    FastDFS+Nginx - 本地搭建文件服務(wù)器同時實現(xiàn)在外遠(yuǎn)程訪問「端口映射」

    FastDFS是一個開源的輕量級分布式文件系統(tǒng),它對文件進(jìn)行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負(fù)載均衡的問題。特別適合以文件為載體的在線服務(wù),如相冊網(wǎng)站、視頻網(wǎng)站等等。 FastDFS為互聯(lián)網(wǎng)量身定制,充分考

    2024年02月11日
    瀏覽(32)
  • FastDFS+Nginx - 本地搭建文件服務(wù)器同時實現(xiàn)在外遠(yuǎn)程訪問「端口映射」(1)

    FastDFS+Nginx - 本地搭建文件服務(wù)器同時實現(xiàn)在外遠(yuǎn)程訪問「端口映射」(1)

    大家好,我是曉星航。今天為大家?guī)淼氖?FastDFS+Nginx 的講解!?? 轉(zhuǎn)載自cpolar極點(diǎn)云的文章:FastDFS與Nginx結(jié)合搭建文件服務(wù)器,并內(nèi)網(wǎng)穿透實現(xiàn)公網(wǎng)訪問 FastDFS是一個開源的輕量級分布式文件系統(tǒng),它對文件進(jìn)行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、

    2024年02月04日
    瀏覽(49)
  • FastDFS與Nginx結(jié)合搭建文件服務(wù)器,并實現(xiàn)公網(wǎng)訪問【內(nèi)網(wǎng)穿透】

    FastDFS與Nginx結(jié)合搭建文件服務(wù)器,并實現(xiàn)公網(wǎng)訪問【內(nèi)網(wǎng)穿透】

    FastDFS是一個開源的輕量級分布式文件系統(tǒng),它對文件進(jìn)行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負(fù)載均衡的問題。特別適合以文件為載體的在線服務(wù),如相冊網(wǎng)站、視頻網(wǎng)站等等。 FastDFS為互聯(lián)網(wǎng)量身定制,充分考

    2024年02月11日
    瀏覽(43)
  • FastDFS+Nginx - 本地搭建文件服務(wù)器同時實現(xiàn)在外遠(yuǎn)程訪問「內(nèi)網(wǎng)穿透」

    FastDFS+Nginx - 本地搭建文件服務(wù)器同時實現(xiàn)在外遠(yuǎn)程訪問「內(nèi)網(wǎng)穿透」

    FastDFS是一個開源的輕量級分布式文件系統(tǒng),它對文件進(jìn)行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負(fù)載均衡的問題。特別適合以文件為載體的在線服務(wù),如相冊網(wǎng)站、視頻網(wǎng)站等等。 FastDFS為互聯(lián)網(wǎng)量身定制,充分考

    2024年02月05日
    瀏覽(42)
  • FastDFS與Nginx結(jié)合搭建文件服務(wù)器,并內(nèi)網(wǎng)穿透實現(xiàn)公網(wǎng)訪問

    FastDFS與Nginx結(jié)合搭建文件服務(wù)器,并內(nèi)網(wǎng)穿透實現(xiàn)公網(wǎng)訪問

    FastDFS是一個開源的輕量級分布式文件系統(tǒng),它對文件進(jìn)行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負(fù)載均衡的問題。特別適合以文件為載體的在線服務(wù),如相冊網(wǎng)站、視頻網(wǎng)站等等。 FastDFS為互聯(lián)網(wǎng)量身定制,充分考

    2024年02月01日
    瀏覽(29)
  • Nginx http 文件服務(wù)器 中文名稱文件亂碼以及不能訪問下載問題 (解決全過程)...

    Nginx http 文件服務(wù)器 中文名稱文件亂碼以及不能訪問下載問題 (解決全過程)...

    書接上文: 在Windows 環(huán)境下使用 Nginx 搭建 HTTP文件服務(wù)器 實現(xiàn)文件下載 全步驟(詳細(xì)) 發(fā)現(xiàn)的中文亂碼問題,終于自己解決了! ^_^ 問題起因: 首先是發(fā)現(xiàn)放在 Nginx 共享文件夾下的中文文件會出現(xiàn)亂碼問題 初步解決辦法: 檢查 conf 下 nginx.conf 配置文件中的 charset 編碼問題 發(fā)

    2024年02月11日
    瀏覽(32)
  • 使用Nginx代理訪問服務(wù)器的.mp4文件,并使用Vue播放

    使用Nginx代理訪問服務(wù)器的.mp4文件,并使用Vue播放

    請參考:https://blog.csdn.net/yueyue763184/article/details/126776158?spm=1001.2014.3001.5502 進(jìn)入 nginx0 容器: 查看 nginx.conf 配置文件位置: exit或者Ctrl+D退出容器,然后拷貝配置文件: 修改?nginx.conf 配置文件: 在/home/nginx/www目錄下創(chuàng)建images文件夾,并上傳.mp4文件在其下 ?接下來就可以刪除n

    2024年02月13日
    瀏覽(56)
  • FastDFS文件系統(tǒng)本地部署結(jié)合Nginx與內(nèi)網(wǎng)穿透實現(xiàn)遠(yuǎn)程訪問本地服務(wù)器

    FastDFS文件系統(tǒng)本地部署結(jié)合Nginx與內(nèi)網(wǎng)穿透實現(xiàn)遠(yuǎn)程訪問本地服務(wù)器

    FastDFS是一個開源的輕量級分布式文件系統(tǒng),它對文件進(jìn)行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負(fù)載均衡的問題。特別適合以文件為載體的在線服務(wù),如相冊網(wǎng)站、視頻網(wǎng)站等等。 FastDFS為互聯(lián)網(wǎng)量身定制,充分考

    2024年02月05日
    瀏覽(31)
  • ChatGPT的回答是否有時效性?

    ChatGPT的回答在某種程度上具有時效性,但也存在一些限制。下面是對ChatGPT回答時效性的詳細(xì)分析。 1. 基于靜態(tài)知識:ChatGPT模型是通過對大規(guī)模文本數(shù)據(jù)進(jìn)行預(yù)訓(xùn)練來獲取知識。因此,它的回答主要基于其在訓(xùn)練時所接觸到的靜態(tài)知識庫,而不會實時更新。這意味著,如果問

    2024年02月09日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包