开发者社区 问答 正文

阿里云OSS 文件Url签名过期依然可以访问(已经设置cache-control为no-cache)

       try {
            // 设置签名URL过期时间,单位为毫秒。

            System.out.println("开始时间:"+ DateUtil.date(System.currentTimeMillis()));
            Date expiration = new Date(System.currentTimeMillis() + 3000);
            // 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。
            System.out.println("过期时间:"+ DateUtil.date(expiration));
            URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
            System.out.println(url);
            tmp = url;
        } catch (OSSException oe) {
        } catch (ClientException ce) {
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        System.out.println("第一次读取图片时间:" + DateUtil.date());
        PicUtils.GetUrlPic(tmp,"E:\\Cache\\tmp1.png");
        Thread.sleep(5000);
        System.out.println("第二次读取图片时间:" + DateUtil.date());
        PicUtils.GetUrlPic(tmp,"E:\\Cache\\tmp2.png");

开始时间:2022-09-05 15:28:15

过期时间:2022-09-05 15:28:18

第一次读取图片时间:2022-09-05 15:28:15

第二次读取图片时间:2022-09-05 15:28:20

在第二次通过Url读取图片时,已经过了Url签名的有效时间,但是依然能访问并且读取到了图片文件。

展开
收起
游客bebs4kazlsxpe 2022-09-05 15:33:18 2446 分享 版权
阿里云 AI 助理回答

根据您提供的代码和运行结果,签名URL在过期后仍然可以访问并读取图片文件。这种现象可能与浏览器缓存机制或OSS文件的元数据配置有关。以下是详细分析及解决方案:


问题原因分析

  1. 浏览器缓存机制
    如果签名URL已经在浏览器中打开,并且浏览器对文件进行了缓存,则即使签名URL已过期,浏览器仍可能通过缓存访问文件。

    • 浏览器会根据HTTP响应头中的Cache-ControlExpires字段决定是否缓存文件以及缓存的有效时间。
    • 如果这些字段未正确设置,浏览器可能会缓存文件较长时间。
  2. OSS文件元数据配置
    OSS文件的元数据(如Cache-ControlExpires)会影响文件的缓存行为。如果这些字段未明确设置,可能导致文件被缓存的时间超过签名URL的有效期。


解决方案

1. 禁用浏览器缓存

为了避免浏览器缓存导致签名URL过期后仍可访问的问题,可以通过以下方式禁用缓存:

  • 设置文件元数据: 在上传文件时,为文件设置Cache-ControlExpires元数据,确保浏览器不会缓存文件或缓存时间较短。例如:

    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setCacheControl("no-cache");
    metadata.setExpirationTime(new Date(System.currentTimeMillis() + 3000)); // 设置较短的缓存时间
    ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()), metadata);
    

    这样可以确保浏览器在签名URL过期后无法通过缓存访问文件。

  • 修改现有文件的元数据: 如果文件已经上传,可以通过OSS控制台或SDK修改文件的元数据。例如:

    CopyObjectRequest request = new CopyObjectRequest(bucketName, objectName, bucketName, objectName);
    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setCacheControl("no-cache");
    request.setNewObjectMetadata(metadata);
    ossClient.copyObject(request);
    

2. 使用短有效期的签名URL

为了减少缓存的影响,建议生成短有效期的签名URL(例如几分钟),并在需要时重新生成新的签名URL。例如:

Date expiration = new Date(System.currentTimeMillis() + 60 * 1000); // 设置有效期为1分钟
URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);

3. 验证签名URL的有效性

在服务端验证签名URL是否已过期。如果签名URL已过期,返回错误响应,避免客户端继续使用过期的URL。


重要提醒

  • 安全性考虑:
    禁用缓存可能会增加OSS的请求数和外网流出流量,因此需要根据实际业务场景合理配置缓存策略。

  • 签名URL不可修改:
    签名URL生成后无法修改其有效期。如果需要调整有效期,请重新生成签名URL。


总结操作步骤

  1. 检查文件元数据:

    • 确保文件的Cache-Control设置为no-cache
    • 确保Expires时间小于签名URL的有效期。
  2. 生成短有效期的签名URL:

    • 设置合理的过期时间(例如1分钟或5分钟)。
    • 在需要时重新生成签名URL。
  3. 验证签名URL的有效性:

    • 在服务端验证签名URL是否已过期,避免客户端使用过期的URL。

通过以上措施,可以有效解决签名URL过期后仍可访问的问题,同时确保系统的安全性和性能平衡。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答