NginxUrl校驗路徑token+時間戳


nginx 使用 openRestry 版本

在配置文件中設置

    #  路徑加密 文件  
    location ^~/group/ {
        access_by_lua '
            -- 獲取請求路徑,不包括參數。例如:/group/456.png
            local uri = ngx.var.uri;
            -- 獲取請求參數
            local args = ngx.req.get_uri_args();
            -- 獲取請求參數中時間戳信息,傳入的是毫秒
            local ts  = args["ts"];
            -- 獲取請求參數中 token 信息
            local token1 = args["token"];

            -- 更新系統緩存時間戳
            ngx.update_time();
            -- 獲取當前服務器系統時間,ngx.time() 獲取的是秒
            local getTime = ngx.time() * 1000;
            -- 計算時間差
            local diffTime = tonumber(ts) - getTime;
            -- md5 加鹽加密
            local token2 = ngx.md5(tostring(uri) .. "salt" .. tostring(ts));

            -- 判斷時間是否有效
            if (tonumber(diffTime) > 0) then
                -- 校驗 token 是否相等
                if token1 == token2 then
                    -- 校驗通過則轉發請求
                    ngx.exec("@fastDFS");

                end
            end
        ';
    } 
    # 使用 lua 腳本  進行路徑判斷 

    # 獲取當前系統時間,並返回  ###
    location /getTime {
        default_type text/html;
        content_by_lua '
            ngx.say(ngx.time() * 1000);
        ';   
    }

以上為nginx.conf 中配置的信息

java 生成對應的url token

  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStreamReader;
  import java.net.URL;
  import org.junit.Test;
  import org.springframework.util.DigestUtils;

  /**
    * @description 生成帶有效期與 token 的 URL 測試
    * @author HochenChong
    * @date 2018-7-15
    * @version 0.1
    */

  public class NginxTest {
            @Test
            public void test() {
                // 獲取 Nginx 服務器上的系統時間
                  String requestUrl = "http://localhost/getTime";
                  long systemTime = Long.parseLong(getURLContent(requestUrl));
                  System.out.println("Nginx 服務器上系統時間:" + systemTime);

                      // 請求的資源路徑
                  String requestResources = "/group/234.jpg";
                  String url = getUrl(requestResources, systemTime);
                  System.out.println("請求的 url 為:");
                  System.out.println("192.168.229.165  /" + url);
            }

      /**
       * 獲取帶時間戳與 token 的 url
       * @param requestResources 請求的資源路徑,不包括 IP 地址與端口,開頭有 /,例如 /group1/M00/00/00/wKjlpltF-K-AZQQsAABhhboA1Kk469.png
       * @param systemTime 系統時間
       * @return 返回請求的 url 地址,包括有效期與 token
       */
      public static String getUrl(String requestResources, long systemTime) {
          // 添加有效期時間,假設該鏈接有效期為 1 天,即 86400000
          // 計算毫秒時,切記轉換為 Long 類型進行運算,避免超出 int 類型的范圍
          // 有效期,單位:毫秒
          // 自己測試時,為了方便,可以設置為 1 分鍾之類的
          long milliseconds = systemTime + 1L * 24 * 60 * 60 * 1000;
          // long milliseconds = systemTime + 60L * 1000;
          // 計算 token 信息
          // “鹽” 值,和 Nginx 服務器上的保持一致即可
          String salt = "salt";
          // 加密前的字符串:請求的資源路徑 + “鹽” 值 + 時間戳
          String beforeEncryptionString = requestResources + salt + milliseconds;
          // 這里使用 Spring 提供的 md5 加密工具進行 md5 加密
          String token = DigestUtils.md5DigestAsHex(beforeEncryptionString.getBytes());
          String url = requestResources + "?ts=" + milliseconds + "&token=" + token;
          return url;
      }

      /**
       * 獲取請求 url 返回的文本
       * @param requestUrl 請求的 url
       * @return
       */
      public static String getURLContent(String requestUrl) {
          URL url = null;
          BufferedReader in = null;
          StringBuffer sb = new StringBuffer(); 
          try {
              url = new URL(requestUrl);     
              in = new BufferedReader(new InputStreamReader(url.openStream())); 
              String str = null;  
              while ((str = in.readLine()) != null) {
                  sb.append(str);     
              } 
          } catch (Exception e) {
              e.printStackTrace();
          } finally{   
              // 關閉資源
              try {
                  if (in != null) {
                      in.close();
                  }
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
          return sb.toString();
      }
  }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM