Nginx、Springmvc實現下載文件訪問控制

Nginx利用X-sendfile結合Springmvc實現文件下載的訪問控制(權限、積分、次數等)


1. 訪問控制流程

  • 請求下載地址:http://localhost/xxx-xxx/app/xxxx/4eecd20d9bdd45e9a6283105eb54fa0d

    • 4eecd20d9bdd45e9a6283105eb54f : 請求文件的標識號,也可以放在header中。
    • xxx-xxx/app/xxxx : 爲Springmvc請求地址
  • 前端使用nginx進行監聽,獲取當前請求地址轉發至web服務器。

  • 應用服務器進行業務邏輯處理

  • 設置setHeader -> X-Accel-Redirect
  • Nginx獲取“X-Accel-Redirect”後以sendfile方式從NFS讀取文件並進行下載

2. Spring Mvc代碼

@RequestMapping(value = "/offline/{id}",method = RequestMethod.GET)
public void doDownloadOffline(@PathVariable("id") String offlineId,       HttpServletResponse response) throws IOException {

        File zipFile = appCommonServiceImpl.selectOfflinePackageById(offlineId);
        if (zipFile == null || !zipFile.exists()) {
            response.sendError(404);
        }
        response.setHeader("Content-Type", "application/octet-stream");
        //設置轉發屬性
        // /appoffline/爲Nginx location 名
        response.setHeader("X-Accel-Redirect", "/appoffline/" + zipFile.getName());
        response.setHeader("X-Accel-Charset", "utf-8");
        response.setHeader("Content-Disposition", "attachment; filename=" + zipFile.getName());
    }

3. nginx.conf

       location /app-all {
            #root   html;
            #index  index.html index.htm;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Nginx-Proxy true;
                proxy_set_header Connection "";
                proxy_pass http://127.0.0.1:8080/app-all;

        }

        #設置文件存放path
        location /appoffline/ {
                #設置非瀏覽器訪問
                internal;
                charset utf-8;
                alias /app/offline/;
        }

Nginx 403 forbidden 問題

  • 權限問題(主要爲權限問題):
    在nginx.conf 里加入 user root 或者所屬的能讀取文件權限的用戶;
  • 目錄不存在

如有疑問請加公衆號(K171),如果覺得對您有幫助請 github start
公衆號_k171

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章