我正在开发一个应用程序,我们在S3中存储所有文件和图像。我也试图通过使用缓存控件来提高性能。下面是我用于使用GeneratePresignedUrlRequest将响应缓存控制添加到生成的URL的示例代码
System.out.println("Getting an object from S3 \n");
String bucketName = getParentBucketName(storeType);
java.util.Date expiration = new java.util.Date();
long msec = expiration.getTime();
msec += 1000 * 60 * 60; // 1 hour.
expiration.setTime(msec);
String contentType = "application/octet-stream";
switch (storeType){
case presentation : contentType = "application/vnd.openxmlformats-officedocument.presentationml.presentation"; break;
case pdf : contentType = "application/pdf"; break;
case image :
case thumbnail:
contentType = "image/png";break;
default:
contentType = "application/octet-stream";
}
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, key);
generatePresignedUrlRequest.setMethod(HttpMethod.GET); // Default.
ResponseHeaderOverrides responseHeaders = new ResponseHeaderOverrides();
responseHeaders.setContentType(contentType);
responseHeaders.setCacheControl("max-age=31536000");
responseHeaders.setExpires(expiration.toString());
//
generatePresignedUrlRequest.setResponseHeaders(responseHeaders);
return s3client.generatePresignedUrl(generatePresignedUrlRequest).toString();
然而,这不起作用。浏览器一次又一次地在生成的URL上请求文件。为了您的信息,每次我需要为S3中的特定对象生成URL时,都会执行上面的代码。我使用chrome开发人员工具来查看S3返回的响应中是否存在Cache-Control。确实存在。我不知道为什么它不起作用。我有什么遗失的东西吗?
提前致谢。
此致 阿米尔
答案 0 :(得分:2)
当请求URL完全相同时,浏览器只能使用缓存的响应,包括查询字符串......所以,如果每次都重新生成签名的URL,浏览器会正确地认为这是一个不同的对象,因为查询字符串不同。