浏览器不使用GeneratePresignedUrlRequest缓存S3对象

时间:2015-11-27 21:45:38

标签: caching amazon-s3

我正在开发一个应用程序,我们在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。确实存在。我不知道为什么它不起作用。我有什么遗失的东西吗?

提前致谢。

此致 阿米尔

1 个答案:

答案 0 :(得分:2)

当请求URL完全相同时,浏览器只能使用缓存的响应,包括查询字符串......所以,如果每次都重新生成签名的URL,浏览器会正确地认为这是一个不同的对象,因为查询字符串不同。