一、generatePresignedUrl方法簡介
Amazon S3提供的generatePresignedUrl方法用於生成預簽名URL(Pre-Signed URL)。預簽名URL是一個能夠提供對Amazon S3資源臨時訪問權限的URL,它可以被其他人或者應用程序使用,以在URL的有效期內訪問Amazon S3中的資源。
預簽名URL可以在不暴露Amazon S3資源的訪問密鑰(Access Key)的情況下,允許其他人或者應用程序訪問Amazon S3中的資源。預簽名URL也可以用於在特定時限內,讓臨時訪問授權的客戶端執行對Amazon S3中的資源的讀/寫操作。
二、生成預簽名URL
generatePresignedUrl方法可以用於生成預簽名URL,以便其他人或者應用程序可以在URL有效期內訪問Amazon S3中的資源。下面是一個示例:
import java.net.URL; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest; public class S3Service { private static final String S3_BUCKET_NAME = "my-s3-bucket"; private AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build(); public URL generatePresignedUrl(String key) { GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(S3_BUCKET_NAME, key); return s3Client.generatePresignedUrl(generatePresignedUrlRequest); } }
在上面的示例中,我們首先建立了一個Amazon S3客戶端(AmazonS3),然後調用generatePresignedUrl方法,將S3_BUCKET_NAME和key作為參數傳遞。generatePresignedUrl會返回一個URL,該URL可以在URL有效期內提供對Amazon S3中指定資源的訪問權限。
三、控制URL的有效期
generatePresignedUrl方法還可以通過GeneratePresignedUrlRequest API用於控制URL的有效期。GeneratePresignedUrlRequest API提供了多個方法,可以設置URL的有效期、服務端加密、條件檢查等參數。下面是一些示例:
1. 控制URL的有效期:
import java.net.URL; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest; import java.util.Date; public class S3Service { private static final String S3_BUCKET_NAME = "my-s3-bucket"; private AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build(); public URL generatePresignedUrl(String key) { GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(S3_BUCKET_NAME, key); //設置URL有效期為24小時 generatePresignedUrlRequest.setExpiration(new Date(System.currentTimeMillis() + 24 * 60 * 60 * 1000)); return s3Client.generatePresignedUrl(generatePresignedUrlRequest); } }
上述示例中,我們使用setExpiration方法設置了URL的有效期為24小時。URL將在指定的時間過期,無法再次訪問Amazon S3中的資源。
2. 服務端加密:
import java.net.URL; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest; import com.amazonaws.services.s3.model.ObjectMetadata; public class S3Service { private static final String S3_BUCKET_NAME = "my-s3-bucket"; private AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build(); public URL generatePresignedUrl(String key) { GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(S3_BUCKET_NAME, key); //設置服務端加密 ObjectMetadata metadata = new ObjectMetadata(); metadata.setSSEAlgorithm(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION); generatePresignedUrlRequest.setObjectMetadata(metadata); return s3Client.generatePresignedUrl(generatePresignedUrlRequest); } }
上述示例中,我們使用setObjectMetadata方法設置了服務端加密。服務端將在保存object時對其進行加密,以確保數據的安全性。
3. 條件檢查:
import java.net.URL; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest; import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.ResponseHeaderOverrides; import java.util.Date; public class S3Service { private static final String S3_BUCKET_NAME = "my-s3-bucket"; private AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build(); public URL generatePresignedUrl(String key) { GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(S3_BUCKET_NAME, key); //設置條件檢查 ResponseHeaderOverrides overrides = new ResponseHeaderOverrides(); overrides.setContentType("text/xml"); generatePresignedUrlRequest.setResponseHeaders(overrides); generatePresignedUrlRequest.setExpiration(new Date(System.currentTimeMillis() + 24 * 60 * 60 * 1000)); return s3Client.generatePresignedUrl(generatePresignedUrlRequest); } }
上述示例中,我們使用setResponseHeaders方法設置了條件檢查。如果訪問Amazon S3中的對象時響應頭未返回ContentType為text/xml,則請求將被拒絕。
四、小結
Amazon S3提供的generatePresignedUrl方法是一種非常方便的方法,可以讓我們生成具有有效期限制的預簽名URL,以提供對Amazon S3中資源的訪問權限。方法具有可配置、彈性、安全等特點,可以滿足我們在不同應用場景下的需求。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/245754.html