Вот альтернатива, которая действительно скрывает S3 URL.Вместо создания URL-адреса с проверкой подлинности в строке запроса, который имеет ограниченную жизнеспособность, этот подход принимает запрос пользователя, авторизует пользователя, извлекает данные S3 и, наконец, возвращает данные запрашивающей стороне.
Преимущество этого подхода состоит в том, что пользователь не имеет возможности узнать URL-адрес S3 и не может передать его кому-либо еще, как это имеет место в URL-адресе с проверкой подлинности в строке запроса в течение срока его действия.Недостатки этого подхода: 1) имеется дополнительный посредник в середине «получения» S3, и 2) возможно, что будет взиматься дополнительная плата за пропускную способность, в зависимости от того, где физически находятся данные S3.
public void streamContent( User requestor, String contentFilename, OutputStream outputStream ) throws Exception {
// is the requestor entitled to this content?
Boolean isAuthorized = authorizeUser( requestor, filename );
if( isAuthorized ) {
AWSCredentials myCredentials = new BasicAWSCredentials( s3accessKey, s3secretKey );
AmazonS3 s3 = new AmazonS3Client( myCredentials );
S3Object object = s3.getObject( s3bucketName, contentFilename );
FileCopyUtils.copy( object.getObjectContent(), outputStream );
}
}