Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为生成安全的URL_Java_Amazon Web Services_Servlets_Amazon S3_Jwt - Fatal编程技术网

Java 如何为生成安全的URL

Java 如何为生成安全的URL,java,amazon-web-services,servlets,amazon-s3,jwt,Java,Amazon Web Services,Servlets,Amazon S3,Jwt,我正在使用Java SDK将项目上传到Amazon S3。我上传的一些项目需要是公共的,我可以通过公共URL访问,而其他一些项目则需要是私有的。请检查下面的代码 public class FileUpload { public static int PUBLIC = 1; public static int PRIVATE = 2; public void UploadObjectSingleOperation(String bucketName, InputStre

我正在使用Java SDK将项目上传到Amazon S3。我上传的一些项目需要是公共的,我可以通过公共URL访问,而其他一些项目则需要是私有的。请检查下面的代码

public class FileUpload {

    public static int PUBLIC = 1;
    public static int PRIVATE = 2;

    public void UploadObjectSingleOperation(String bucketName, InputStream inputStream, String fileName, int privacy) {

        String keyName = "xxxxxxxxxxx";
        String secret = "xxxxxxxxxxxxxxxxxxxxxxxxx";

        BasicAWSCredentials creds = new BasicAWSCredentials(keyName, secret);
        AmazonS3 s3client=null;

        if(privacy==PUBLIC)
        {
            s3client = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(creds)).withRegion(Regions.AP_SOUTH_1).build();
        }
        else if(privacy==PRIVATE)
        {
            s3client = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(creds)).build();
        }


        try {
            System.out.println("Uploading a new object to S3 from a file\n");

            s3client.putObject(new PutObjectRequest(bucketName, fileName, inputStream,null).withCannedAcl(CannedAccessControlList.PublicRead));

        } catch (AmazonServiceException ase) {
            System.out.println("Caught an AmazonServiceException, which "
                    + "means your request made it "
                    + "to Amazon S3, but was rejected with an error response"
                    + " for some reason.");
            System.out.println("Error Message:    " + ase.getMessage());
            System.out.println("HTTP Status Code: " + ase.getStatusCode());
            System.out.println("AWS Error Code:   " + ase.getErrorCode());
            System.out.println("Error Type:       " + ase.getErrorType());
            System.out.println("Request ID:       " + ase.getRequestId());
        } catch (AmazonClientException ace) {
            System.out.println("Caught an AmazonClientException, which "
                    + "means the client encountered "
                    + "an internal error while trying to "
                    + "communicate with S3, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message: " + ace.getMessage());
        }
    }
}
对于私有对象,如何获得安全的URL,比如“标记化”URL?这意味着,URL存在,但需要一些特殊验证才能“工作”或“允许访问”,因此除了我的应用程序之外,不是每个人都可以访问URL。我该怎么做


我在S3中查看了
签名URL
,但它只设置了过期日期/时间。我的URL不需要过期,但需要一些访问验证

上传到s3后,您需要使用s3client通过bucket/key请求对象的预签名url

:

预签名URL的有效期最长为七天,因为您在签名计算中使用的签名密钥的有效期最长为七天

AWS文档提供了一个示例,说明如何:


上传到s3后,需要使用s3client通过bucket/key请求对象的预签名url

:

预签名URL的有效期最长为七天,因为您在签名计算中使用的签名密钥的有效期最长为七天

AWS文档提供了一个示例,说明如何:


嗨,Ryan,正如我在问题中提到的,签名的URL也可以被任何人访问,我正在寻找一种机制,其中S3需要以某种方式“验证”URL访问。这些私有URL的内容将在android应用程序中为“付费用户”显示,我不希望他们以某种方式获取URL并将其交给尚未付款的人。@PeakGen-啊,好的,我在这里为另一个用户回答了这个问题:-这个过程相当于使用Amazon Cognito,因此只有你的应用程序的用户才能访问特定的存储桶,而且它甚至避免了需要预先签名的URL。即使您不需要用户登录到您的appHi Ryan,这也可以实现,正如我在问题中提到的,任何人都可以访问已签名的URL,我正在寻找一种机制,其中S3需要以某种方式“验证”URL访问。这些私有URL的内容将在android应用程序中为“付费用户”显示,我不希望他们以某种方式获取URL并将其交给尚未付款的人。@PeakGen-啊,好的,我在这里为另一个用户回答了这个问题:-这个过程相当于使用Amazon Cognito,因此只有你的应用程序的用户才能访问特定的存储桶,而且它甚至避免了需要预先签名的URL。即使您不要求用户登录到您的应用程序中,此功能也能正常工作
AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider()); 

java.util.Date expiration = new java.util.Date();
long msec = expiration.getTime();
msec += 1000 * 60 * 60; // 1 hour.
expiration.setTime(msec);

GeneratePresignedUrlRequest generatePresignedUrlRequest = 
              new GeneratePresignedUrlRequest(bucketName, objectKey);
generatePresignedUrlRequest.setMethod(HttpMethod.GET); // Default.
generatePresignedUrlRequest.setExpiration(expiration);

URL s = s3client.generatePresignedUrl(generatePresignedUrlRequest);