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签名的有效时间,但是依然能访问并且读取到了图片文件。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您提供的代码和运行结果,签名URL在过期后仍然可以访问并读取图片文件。这种现象可能与浏览器缓存机制或OSS文件的元数据配置有关。以下是详细分析及解决方案:
浏览器缓存机制
如果签名URL已经在浏览器中打开,并且浏览器对文件进行了缓存,则即使签名URL已过期,浏览器仍可能通过缓存访问文件。
Cache-Control
或Expires
字段决定是否缓存文件以及缓存的有效时间。OSS文件元数据配置
OSS文件的元数据(如Cache-Control
和Expires
)会影响文件的缓存行为。如果这些字段未明确设置,可能导致文件被缓存的时间超过签名URL的有效期。
为了避免浏览器缓存导致签名URL过期后仍可访问的问题,可以通过以下方式禁用缓存:
设置文件元数据: 在上传文件时,为文件设置Cache-Control
和Expires
元数据,确保浏览器不会缓存文件或缓存时间较短。例如:
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);
为了减少缓存的影响,建议生成短有效期的签名URL(例如几分钟),并在需要时重新生成新的签名URL。例如:
Date expiration = new Date(System.currentTimeMillis() + 60 * 1000); // 设置有效期为1分钟
URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
在服务端验证签名URL是否已过期。如果签名URL已过期,返回错误响应,避免客户端继续使用过期的URL。
安全性考虑:
禁用缓存可能会增加OSS的请求数和外网流出流量,因此需要根据实际业务场景合理配置缓存策略。
签名URL不可修改:
签名URL生成后无法修改其有效期。如果需要调整有效期,请重新生成签名URL。
检查文件元数据:
Cache-Control
设置为no-cache
。Expires
时间小于签名URL的有效期。生成短有效期的签名URL:
验证签名URL的有效性:
通过以上措施,可以有效解决签名URL过期后仍可访问的问题,同时确保系统的安全性和性能平衡。