我遇到了同样的问题,并通过缓存图像预签名网址链接解决了这个问题,这将解决问题。
当您从 AWS 请求一个预签名的 url 时,它会返回一个带有过期和签名的链接,该链接指向您存储桶中的源文件,每次您进行刷新时:服务器会将请求传递给 AWS,然后检索一个浏览器一无所知的新过期和签名,因此它将再次获取相同的图像。
告诉浏览器不要再获取它的方法是在刷新页面时发回相同的签名!这听起来很简单,但它可能会变得一团糟,所以请耐心等待。
我提出的解决方案是使用 "Redis" 缓存层,将浏览器加载的图像映射到串行。
如果 userA 加载该页面,您只需检查它是否曾被同一用户和同一浏览器和 MacAddress/IP 使用“串行”访问过,您应该将其添加到浏览器的本地存储中,
serial structure = (browser-type&name + userID + MacAddress/IP),这是为了确保用户A同时从不同的设备和浏览器登录时它可以工作,并确保每次 userA 从该特定浏览器和设备加载页面/图像时,您都会创建相同的序列号。
如果用户A没有序列号保存到本地存储,则将其添加到本地存储并去检查序列是否存在于Redis中(用户可能之前登录并清除了浏览器缓存) ,如果是,则删除包含图像的预签名链接作为参数的附加对象:
"serial" :
{
imageID_1 : "https://s3.bucket.xxx/imageID_1.jpg?.......xyz1",
imageID_2 : "https://s3.bucket.xxx/imageID_2.jpg?.......xyz2",
imageID_3 : "https://s3.bucket.xxx/imageID_3.jpg?.......xyz3"
}
然后为必须在页面上加载的每个 imageID/key 请求新的预签名 url,并将它们附加到 Redis 中的“串行”对象参数。如果没有,那么只需添加两个“串行”+对象参数:
"serial" :
{
imageID_1 : "https://s3.bucket.xxx/imageID_1.jpg?.......abc1",
imageID_2 : "https://s3.bucket.xxx/imageID_2.jpg?.......abc2",
imageID_3 : "https://s3.bucket.xxx/imageID_3.jpg?.......abc3"
}
如果浏览器有一个缓存到本地存储的串行,您还必须检查每个请求是否存在与串行链接的对象参数中的 imageID
为了为其创建 presigned-url(如果它不存在),然后将其作为新参数添加到对象中:
"serial" :
{
imageID_1 : "https://s3.bucket.xxx/imageID_1.jpg?.......abc1",
imageID_2 : "https://s3.bucket.xxx/imageID_2.jpg?.......abc2",
imageID_3 : "https://s3.bucket.xxx/imageID_3.jpg?.......abc3",
imageID_4 : "https://s3.bucket.xxx/imageID_4.jpg?.......abc4",
}
如果用户已经将序列号保存到浏览器本地存储中,说明之前有一些加载的图像,所以我们必须检查用户A是否请求之前加载的相同图像,或者他正在请求新的图像。
最后,您必须检查是否由于任何原因未加载或禁止从浏览器访问图像(用于检查并向服务器报告的字体端代码),在这种情况下,您只需删除串行附加对象并附加新的预签名 URL,然后将它们发送回前端(浏览器)。