我正在构建一个在Elastic Beanstalk上托管的Spring Web应用程序。我使用S3存储用户上传的图像,效果很好。我不明白的是如何从S3到客户端获取图像。我发现了三种选择。
1.在控制器中获取图像并将其发送给客户端。像这样:
S3Object object = amazonS3Client.getObject("bucketname", "path/to/image");
2.打开所有图像,并通过客户端中的URL直接访问它。像这样的东西:
<img src="http://aws.amazon.com/bucket/path/to/image.jpg">
3.使用仅在特定时间有效的签名下载URL。像这样:
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest("bucketname", "path/to/image");
String url = conn.generatePresignedUrl(request)
我不确定该采用哪种方法。通过Web服务器路由它似乎是不必要的,因为它会加载服务器。由于任何人都可以使用图像,因此向任何人打开URL都可能会增加请求和成本。第三种方法对我来说是新的,还没有真正看到有人练习过这种方法,如果这真的是可行的话,这会使我感到不安全。
那么,通常如何做呢?
以及如何在开发环境和生产环境中使用它。我猜它没有改变吗?还是在开发时使用弹簧轮廓来更改静态内容的位置并仅将S3用于生产是常见的吗?
如果您托管Java脚本,即S3上的CSS,那么最常见的做法是采用方法2并向所有人开放?
对我而言,这取决于您对用户上传的图像的访问控制的要求。
如果图像是不敏感的,即别人是否拥有另一个用户的图像并不重要,那么我将采用方法2。
另一方面,如果某人设法控制了另一个用户的图像将是一场灾难,那么我将采用方法3(或其他一些使令牌访问图像过期的方式)。
我上次这样做时,我选择了方法2,因为图像不敏感。为了防止人们发现图像,我们确实对图像名称应用了哈希函数,但是我对此并没有太大的担心。无论哪种情况,在为图像构造URL时,应用程序都可以轻松定义一个定义明确的存储桶结构。因此,对于您来说,也许考虑一下类似的方法:
根据您对开发环境与生产环境的要求,将存储桶名称与Spring配置文件匹配是我们使用的方法。因此,例如:
您可能会猜到,我们有名为“ prod”和“ dev”的Spring配置文件。创建图像URL的代码在创建URL时已将当前Spring概要文件的名称考虑在内。很好地隔离环境。
在CSS和Javascript方面,我倾向于在生产S3存储桶中托管混淆/最小化版本,在dev / test存储桶中托管完整版本(主要是为了提高性能,而不是试图隐藏代码)。另外,在您如何在S3中托管CSS / Javascript时,我将使用某种排序版本控制/命名结构,以便您可以确定应用程序正在使用的资源的“版本”。因此,例如:
每次将新版本推送到生产环境时,都会更新CSS / Javascript资源的版本。
通过这条路,您可以将S3看作是准备进入广泛生产环境的一段Javascript / CSS的最终安息之地。一旦到达那里,您就知道它永远不会改变。如果CSS / Javascript确实发生了变化,则用户必须从S3获取新资源,因为版本将会增加。您可以将其挂接到构建过程中,以便您的主应用程序始终引用最新版本的CSS / Javascript。我发现它具有两个有用的功能:
希望能有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句