java AWS S3 GET预签名URL间歇性失败,CORS

lmvvr0a8  于 2022-12-17  发布在  Java
关注(0)|答案(2)|浏览(301)

bounty将在3天后过期。回答此问题可获得+50的声望奖励。ALex正在寻找规范答案

我正在使用java为存储在s3中的图像生成一个预签名的url

public String generateDownloadLink(String bucketName, String responseContentDisposition,
      String key, int days) {

    GetObjectRequest objectRequest =
        GetObjectRequest.builder()
            .bucket(bucketName)
            .responseContentDisposition(responseContentDisposition)
            .key(key).build();

    GetObjectPresignRequest preSignRequest =
        GetObjectPresignRequest.builder()
            .signatureDuration(Duration.ofDays(days))
            .getObjectRequest(objectRequest)
            .build();

    PresignedGetObjectRequest presignedRequest = this.s3Presigner.presignGetObject(preSignRequest);

    return presignedRequest.url().toString();

字符串
FE(react)然后使用图像标签加载图像,如下图所示。此模态library在全屏打开时也有一个下载按钮-〉a标签元素。如果按下下载按钮,由于CORS错误,它不会下载任何内容。
这个post解释了原因,尽管这个解决方案不能应用于我的案例。
而且,这种情况时断时续,我不知道在这些情况下有什么不同。有时我可以看到缩略图(也就是库执行初始GET来加载图像并显示它),并且在模态打开后,我可以下载图像(也就是库使用a标签执行另一个GET)。

铲斗CORS配置

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "PUT",
            "GET",
            "HEAD"
        ],
        "AllowedOrigins": [
            "http://localhost:3000",
            "https://<my-host>"
        ],
        "ExposeHeaders": [
            "ETag"
        ],
        "MaxAgeSeconds": 3000
    }
kcwpcxri

kcwpcxri1#

尝试将OPTIONS添加到CORS配置中的AllowedMethods列表。从浏览器发出的CORS预检请求(在“真实的”请求之前)使用OPTIONS http方法,因此需要允许该请求。

tuwxkamq

tuwxkamq2#

我的建议是完全开放CORS政策,如果它开始起作用,那么您可以开始改进访问权限,直到您意识到问题所在:

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "*"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [
            "*"
         
        ],
        "MaxAgeSeconds": 3000
    }
]

这也是一个关于CORS的好博客,可能会有所帮助:
https://aws.amazon.com/blogs/media/deep-dive-into-cors-configs-on-aws-s3-how-to/

相关问题