使用java sdk 2.x生成的预签名url在浏览器可以正常访问,但是其中的域名更换为cloudfront的域名后浏览器访问提示
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature you provided. Check your key and signing method.
</Message>
生成的域名是这样的 https://bucketname.s3.amazonaws.com 改成 https://bucketname.s3.us-east-1.amazonaws.com 还是提示同样的错误;
代码如下:
public static String getS3ObjectUrl(String keyName,String objectName) throws UnsupportedEncodingException {
AwsCredentials awsCredentials =AwsBasicCredentials.create(s3AccessKeyId, s3SecretAccessKey);
AwsCredentialsProvider credentialsProvider=StaticCredentialsProvider.create(awsCredentials );
Region region = Region.US_EAST_1;
S3Presigner presigner = S3Presigner.builder()
.region(region)
.credentialsProvider(credentialsProvider)
.build();
String urlString= getPresignedUrl(presigner,s3Bucket,keyName,objectName);
presigner.close();
return urlString;
}
//获取s3 对象预签名路径
public static String getPresignedUrl(S3Presigner presigner, String bucketName, String keyName,String objectName) throws UnsupportedEncodingException {
try {
GetObjectRequest getObjectRequest = GetObjectRequest.builder()
.responseContentDisposition("attachment; filename=\""+URLEncoder.encode(objectName, "UTF-8")+"\"") //设置更改后的文件名
.bucket(bucketName)
.key(getS3KeyName(keyName))
.build();
GetObjectPresignRequest getObjectPresignRequest = GetObjectPresignRequest.builder()
.signatureDuration(Duration.ofMinutes(100))
.getObjectRequest(getObjectRequest)
.build();
PresignedGetObjectRequest presignedGetObjectRequest = presigner.presignGetObject(getObjectPresignRequest);
String theUrl = presignedGetObjectRequest.url().toString();
System.out.println("Presigned URL: " + theUrl);
return theUrl;
} catch (S3Exception e) {
e.getStackTrace();
}
return "";
}
请帮忙看看是什么原因,谢谢!!!