全部产品
Search
文档中心

Object Storage Service:OSS SDK for Java 1.0

更新时间:Oct 30, 2025

Github | OSS SDK for Java API | mvnrepository

Integrasi cepat

Ikuti langkah-langkah berikut untuk mengintegrasikan OSS SDK for Java 1.0 dengan cepat:

Persiapan lingkungan

Anda harus menginstal Java 7 atau yang lebih baru. Jalankan perintah java -version untuk melihat versi Java Anda. Jika Java belum diinstal atau versi Anda lebih lama dari Java 7, unduh Java.

Instal SDK

Pilih metode instalasi berdasarkan lingkungan pengembangan Anda. Untuk memastikan kode contoh berjalan sesuai harapan, gunakan versi terbaru dari OSS SDK for Java 1.0.

Berikut ini menggunakan instalasi OSS SDK for Java 1.0 3.17.4 sebagai contoh.

Tambahkan dependensi Maven (direkomendasikan)

Untuk menggunakan OSS SDK for Java 1.0 dalam proyek Maven, tambahkan dependensi yang sesuai ke file pom.xml.

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.17.4</version>
</dependency>

Jika Anda menggunakan Java 9 atau yang lebih baru, tambahkan dependensi JAXB berikut.

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>
<!-- tidak lebih dari 2.3.3-->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.3</version>
</dependency>

Impor paket JAR ke proyek Eclipse

  1. Unduh OSS SDK for Java 1.0.

  2. Ekstrak paket tersebut.

  3. Salin file aliyun-sdk-oss-3.17.4.jar dan semua file dari folder lib paket yang diekstraksi ke proyek Anda.

  4. Di Eclipse, pilih proyek Anda, klik kanan, dan pilih Properties > Java Build Path > Add JARs.

  5. Pilih semua file JAR yang disalin dan impor ke Libraries.

Impor paket JAR ke proyek IntelliJ IDEA

  1. Unduh OSS SDK for Java 1.0.

  2. Ekstrak paket tersebut.

  3. Salin file aliyun-sdk-oss-3.17.4.jar dan semua file JAR dari folder lib paket yang diekstraksi ke proyek Anda.

  4. Di IntelliJ IDEA, pilih proyek Anda, klik kanan, dan pilih File > Project Structure > Modules > Dependencies > + > JARs or directories.

  5. Pilih semua file JAR yang disalin dan impor ke External Libraries.

Konfigurasi kredensial akses

Konfigurasikan kredensial akses menggunakan Pasangan AccessKey dari Pengguna RAM.

  1. Di Konsol RAM, buat Pengguna RAM yang menggunakan Permanent AccessKey Pair untuk akses. Simpan Pasangan AccessKey dan berikan izin AliyunOSSFullAccess kepada pengguna.

  2. Gunakan Pasangan AccessKey dari Pengguna RAM untuk mengonfigurasi variabel lingkungan.

    Linux

    1. Jalankan perintah berikut di antarmuka baris perintah untuk menambahkan pengaturan variabel lingkungan ke file ~/.bashrc:

      echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc
      echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc
    2. Jalankan perintah berikut untuk menerapkan perubahan.

      source ~/.bashrc
    3. Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.

      echo $OSS_ACCESS_KEY_ID
      echo $OSS_ACCESS_KEY_SECRET

    macOS

    1. Jalankan perintah berikut di terminal untuk melihat jenis shell default.

      echo $SHELL
    2. Lakukan operasi berikut berdasarkan jenis shell default.

      Zsh

      1. Jalankan perintah berikut untuk menambahkan pengaturan variabel lingkungan ke file ~/.zshrc.

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
      2. Jalankan perintah berikut untuk menerapkan perubahan.

        source ~/.zshrc
      3. Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

      Bash

      1. Jalankan perintah berikut untuk menambahkan pengaturan variabel lingkungan ke file ~/.bash_profile.

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile
      2. Jalankan perintah berikut untuk menerapkan perubahan.

        source ~/.bash_profile
      3. Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

    Windows

    CMD

    1. Jalankan perintah berikut di CMD.

      setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID"
      setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
    2. Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.

      echo %OSS_ACCESS_KEY_ID%
      echo %OSS_ACCESS_KEY_SECRET%

    PowerShell

    1. Jalankan perintah berikut di PowerShell.

      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
    2. Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.

      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)

Inisialisasi klien

Kode contoh berikut menggunakan endpoint publik wilayah China (Hangzhou) untuk menginisialisasi klien dan mencantumkan bucket di wilayah tersebut untuk verifikasi. Untuk daftar lengkap wilayah dan endpoint, lihat Wilayah dan Endpoint.

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.Bucket;

import java.util.List;

/**
 * Contoh integrasi cepat OSS SDK
 * Menunjukkan cara menginisialisasi klien OSS dan mencantumkan semua bucket
 */
public class Test {

    public static void main(String[] args) {
        // Dapatkan kredensial akses dari variabel lingkungan
        String accessKeyId = System.getenv("OSS_ACCESS_KEY_ID");
        String accessKeySecret = System.getenv("OSS_ACCESS_KEY_SECRET");

        // Setel wilayah OSS dan endpoint
        String region = "cn-hangzhou";
        String endpoint = "oss-cn-hangzhou.aliyuncs.com";

        // Buat penyedia kredensial
        DefaultCredentialProvider provider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);

        // Konfigurasikan parameter klien
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // Secara eksplisit deklarasikan penggunaan algoritma tanda tangan V4
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);

        // Inisialisasi klien OSS
        OSS ossClient = OSSClientBuilder.create()
                .credentialsProvider(provider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .endpoint(endpoint)
                .build();

        // Cantumkan semua bucket dari pengguna saat ini
        List<Bucket> buckets = ossClient.listBuckets();
        System.out.println("Berhasil terhubung ke OSS. Bucket di bawah akun saat ini:");

        if (buckets.isEmpty()) {
            System.out.println("Tidak ada bucket yang ditemukan di bawah akun saat ini.");
        } else {
            for (Bucket bucket : buckets) {
                System.out.println("- " + bucket.getName());
            }
        }

        // Lepaskan sumber daya
        ossClient.shutdown();
        System.out.println("Klien OSS telah dimatikan.");
    }
}

Setelah Anda menjalankan kode, bucket dari akun saat ini di semua wilayah akan ditampilkan:

Berhasil terhubung ke OSS. Bucket di bawah akun saat ini:
- example-bucket
Klien OSS telah dimatikan.

Konfigurasi klien

Gunakan kelas ClientConfiguration untuk mengonfigurasi parameter untuk OSSClient, seperti periode timeout, percobaan ulang, dan server proxy.

Klik untuk melihat konfigurasi klien yang didukung

Metode

Deskripsi

ClientConfiguration.setMaxConnections

Mengatur jumlah maksimum koneksi HTTP terbuka yang diizinkan. Nilai defaultnya adalah 1024.

ClientConfiguration.setSocketTimeout

Mengatur periode timeout untuk transfer data di lapisan socket, dalam milidetik. Nilai defaultnya adalah 50000 ms.

ClientConfiguration.setConnectionTimeout

Mengatur periode timeout untuk membuat koneksi, dalam milidetik. Nilai defaultnya adalah 50000 ms.

ClientConfiguration.setConnectionRequestTimeout

Mengatur periode timeout untuk mendapatkan koneksi dari kolam koneksi, dalam milidetik. Secara default, tidak ada batas waktu.

ClientConfiguration.setIdleConnectionTime

Mengatur periode timeout idle untuk koneksi, dalam milidetik. Jika koneksi idle lebih lama dari periode ini, itu akan ditutup. Nilai defaultnya adalah 60000 ms. Untuk informasi lebih lanjut, lihat Atur periode timeout untuk OSS Java SDK 1.0.

ClientConfiguration.setSupportCname

Menentukan apakah mendukung record CNAME sebagai endpoint. CNAME didukung secara default.

ClientConfiguration.setCrcCheckEnabled

Menentukan apakah akan mengaktifkan pemeriksaan CRC. Pemeriksaan CRC diaktifkan secara default.

ClientConfiguration.setSLDEnabled

Menentukan apakah akan mengaktifkan akses melalui domain tingkat kedua. Fitur ini dinonaktifkan secara default.

ClientConfiguration.setProtocol

Protokol (HTTP atau HTTPS) yang digunakan untuk terhubung ke OSS. Protokol defaultnya adalah HTTP.

ClientConfiguration.setUserAgent

User agent, yaitu header User-Agent dalam HTTP. Nilai defaultnya adalah aliyun-sdk-java.

ClientConfiguration.setProxyHost

Alamat host server proxy.

ClientConfiguration.setProxyPort

Port server proxy.

ClientConfiguration.setProxyUsername

Nama pengguna untuk otentikasi server proxy.

ClientConfiguration.setProxyPassword

Kata sandi untuk otentikasi server proxy.

ClientConfiguration.setRedirectEnable

Menentukan apakah akan mengaktifkan pengalihan HTTP.

ClientConfiguration.setVerifySSLEnable

Menentukan apakah akan mengaktifkan verifikasi sertifikat SSL.

ClientConfiguration.setMaxErrorRetry

Jumlah maksimum percobaan ulang untuk permintaan gagal. Nilai defaultnya adalah 3.

ClientConfiguration.setRetryStrategy

Atur kebijakan percobaan ulang kustom. Mengatur parameter ini tidak direkomendasikan.

Gunakan nama domain kustom

Saat Anda menggunakan nama domain default OSS, Anda mungkin menghadapi masalah seperti penolakan akses atau kegagalan pratinjau karena kebijakan keamanan OSS. Dengan mengikat nama domain kustom untuk mengakses OSS, Anda dapat melewati pembatasan akses ini untuk mengaktifkan pratinjau file langsung. Anda juga dapat mengintegrasikan dengan CDN untuk percepatan konten global untuk meningkatkan pengalaman pengguna.

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Aktifkan opsi CNAME untuk mendukung akses melalui nama domain kustom
clientBuilderConfiguration.setSupportCname(true);

OSS ossClient = new OSSClientBuilder()
    // Konfigurasi lain...
    .clientConfiguration(clientBuilderConfiguration)
    // Gunakan nama domain kustom Anda sebagai endpoint, seperti https://static.example.com
    .endpoint("https://static.example.com")
    .build();

Gunakan endpoint internal

Saat aplikasi Anda diterapkan pada layanan Alibaba Cloud, seperti ECS atau Container Service, gunakan endpoint internal. Ini menyediakan transfer data internal gratis, kecepatan lebih cepat, dan stabilitas jaringan yang lebih baik. Akses internal ideal untuk unggah file besar, pemrosesan data batch, dan skenario akses frekuensi tinggi. Ini secara efektif mengurangi biaya dan meningkatkan performa. Untuk daftar lengkap wilayah dan endpoint internal, lihat Wilayah dan Endpoint.

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();

OSS ossClient = new OSSClientBuilder()
    // Konfigurasi lain...      
    .clientConfiguration(clientBuilderConfiguration)
    // Gunakan endpoint internal. Wilayah China (Hangzhou) digunakan sebagai contoh. Untuk wilayah lain, tentukan endpoint sebenarnya.
    .endpoint("oss-cn-hangzhou-internal.aliyuncs.com")
    .build();

Kontrol batas waktu

Konfigurasikan parameter timeout berdasarkan skenario bisnis Anda. Untuk transfer file besar atau lingkungan jaringan yang tidak stabil, tingkatkan periode timeout. Untuk operasi ringan dengan konkurensi tinggi, atur periode timeout yang lebih pendek untuk melepaskan sumber daya dengan cepat.

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Atur jumlah maksimum koneksi HTTP terbuka yang diizinkan. Defaultnya adalah 1024.
clientBuilderConfiguration.setMaxConnections(1024)
    // Atur periode timeout untuk transfer data di lapisan socket, dalam milidetik. Defaultnya adalah 50000 ms.
    .setSocketTimeout(50000)
    // Atur periode timeout untuk membuat koneksi, dalam milidetik. Defaultnya adalah 50000 ms.
    .setConnectionTimeout(50000)
    // Atur periode timeout untuk mendapatkan koneksi dari kolam koneksi, dalam milidetik. Secara default, tidak ada batas waktu.
    .setConnectionRequestTimeout(60 * 60 * 24 * 1000)
    // Atur periode timeout idle untuk koneksi, dalam milidetik. Jika koneksi idle lebih lama dari periode ini, itu akan ditutup. Defaultnya adalah 60000 ms.
    .setIdleConnectionTime(60000);

OSS ossClient = new OSSClientBuilder()
    // Konfigurasi lain...
    .clientConfiguration(clientBuilderConfiguration)
    .build();

Jumlah percobaan ulang kesalahan maksimum

Secara default, klien OSS mencoba ulang permintaan tiga kali untuk meningkatkan tingkat keberhasilan. Di lingkungan dengan konkurensi tinggi atau jaringan tidak stabil, gunakan setMaxErrorRetry untuk meningkatkan jumlah percobaan ulang. Ini dapat secara signifikan meningkatkan ketersediaan layanan. Sesuaikan jumlah percobaan ulang berdasarkan toleransi latensi bisnis Anda dan kualitas lingkungan jaringan Anda.

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Atur jumlah maksimum percobaan ulang untuk permintaan gagal. Sesuaikan ini berdasarkan lingkungan jaringan dan kebutuhan bisnis Anda.
clientBuilderConfiguration.setMaxErrorRetry(5);

OSS ossClient = new OSSClientBuilder()
    // Konfigurasi lain...
    .clientConfiguration(clientBuilderConfiguration)
    .build();

Kebijakan percobaan ulang

Jangan gunakan setRetryStrategy untuk mengatur kebijakan percobaan ulang kustom karena kebijakan kustom dapat menyebabkan perilaku tak terduga dan memengaruhi stabilitas layanan. Klien OSS menggunakan kebijakan percobaan ulang yang terbukti untuk berbagai jenis permintaan:

  • Permintaan POST: Secara default, ini tidak dicoba ulang untuk menghindari ketidaksesuaian data dari pengiriman berulang.

  • Permintaan non-POST: Ini dicoba ulang hingga tiga kali jika kondisi berikut terpenuhi.

    • ClientException terjadi dengan salah satu kode kesalahan berikut: ConnectionTimeout, SocketTimeout, ConnectionRefused, UnknownHost, atau SocketException.

    • OSSException terjadi dengan kode kesalahan selain InvalidResponse.

    • Kesalahan server sementara terjadi dengan kode status HTTP 500, 502, atau 503.

Server proxy

Lingkungan jaringan perusahaan sering menggunakan server proxy untuk mengakses sumber daya eksternal demi alasan keamanan. Setelah Anda mengonfigurasi server proxy, klien OSS meneruskan semua permintaan HTTP melalui server proxy yang ditentukan untuk akses aman ke OSS.

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();

// Atur user agent, yaitu header User-Agent dalam HTTP. Nilai defaultnya adalah aliyun-sdk-java.
clientBuilderConfiguration.setUserAgent("aliyun-sdk-java");
// Atur alamat IP server proxy. Ganti "" dengan alamat IP server proxy sebenarnya, seperti "196.128.xxx.xxx".
clientBuilderConfiguration.setProxyHost("");
// Atur port server proxy, seperti 8080.
clientBuilderConfiguration.setProxyPort(8080);
// Atur nama pengguna untuk otentikasi server proxy. Ganti "" dengan nama pengguna sebenarnya, seperti "admin".
clientBuilderConfiguration.setProxyUsername("");
// Atur kata sandi untuk otentikasi server proxy. Ganti "" dengan kata sandi yang sesuai.
clientBuilderConfiguration.setProxyPassword("");

OSS ossClient = new OSSClientBuilder()
    // Konfigurasi lain...
    .clientConfiguration(clientBuilderConfiguration)
    .build();

Protokol HTTP/HTTPS

Gunakan setProtocol untuk mengatur protokol komunikasi antara klien dan server OSS. Defaultnya adalah HTTP. Kami merekomendasikan penggunaan HTTPS di lingkungan produksi untuk memastikan transfer data aman dan mencegah serangan man-in-the-middle serta pelanggaran data.

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Atur protokol komunikasi ke HTTPS untuk memastikan transfer data aman.
clientBuilderConfiguration.setProtocol(Protocol.HTTPS);

OSS ossClient = new OSSClientBuilder()
    // Konfigurasi lain...
    .clientConfiguration(clientBuilderConfiguration)
    .build();

Versi tanda tangan

Penting

Tanda Tangan Versi 1.0 Alibaba Cloud Object Storage Service akan dihapus sesuai jadwal berikut. Kami merekomendasikan Anda tingkatkan ke Signature V4 sesegera mungkin untuk memastikan layanan Anda tidak terpengaruh.

  • Mulai 1 Maret 2025, pengguna baru tidak akan dapat menggunakan Signature 1.0.

  • Mulai 1 September 2025, Signature 1.0 tidak akan lagi diperbarui atau dipelihara, dan bucket baru tidak akan dapat menggunakan Signature V1.

Gunakan setSignatureVersion untuk mengonfigurasi versi algoritma tanda tangan. Saat menggunakan Signature V4, Anda harus menggunakan parameter region untuk menentukan ID Wilayah yang benar. Algoritma tanda tangan V4 memberikan keamanan yang lebih tinggi. OSS SDK for Java 1.0 3.15.0 dan versi lebih baru mendukung Signature V4.

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Atur versi algoritma tanda tangan ke V4 untuk keamanan yang lebih tinggi.
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);

OSS ossClient = new OSSClientBuilder()
    // Konfigurasi lain...
    // Anda harus menentukan ID wilayah saat menggunakan Signature V4.
    .region("cn-hangzhou")
    .clientConfiguration(clientBuilderConfiguration)
    .build();

Gunakan alamat IP

Menggunakan alamat IP sebagai endpoint terutama digunakan untuk akses jaringan internal dan lingkungan jaringan khusus. Setelah Anda membuat koneksi jaringan menggunakan CEN, Express Connect, jalur sewa, atau VPN, gunakan alamat IP untuk mengakses OSS secara langsung. Ini melewati proses resolusi DNS dan meningkatkan efisiensi akses. Untuk konfigurasi rute spesifik, lihat Endpoint Internal dan Blok CIDR VIP untuk OSS.

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Aktifkan fitur domain tingkat kedua untuk mendukung akses melalui alamat IP. Fitur ini dinonaktifkan secara default.
// Nilai ini harus disetel untuk OSS Java SDK 1.0 versi 2.1.2 dan sebelumnya.
// Versi 2.1.2 dan lebih baru secara otomatis mendeteksi alamat IP, sehingga nilai ini tidak lagi diperlukan.
clientBuilderConfiguration.setSLDEnabled(true);

OSS ossClient = new OSSClientBuilder()
    // Konfigurasi lain...
    .clientConfiguration(clientBuilderConfiguration)
    // Saat mengakses OSS menggunakan alamat IP, gunakan protokol HTTP untuk menghindari masalah verifikasi sertifikat SSL.
    .endpoint("http://10.10.10.10")
    .build();

Pemeriksaan CRC

OSS mengaktifkan pemeriksaan data cyclic redundancy check (CRC) secara default untuk memastikan integritas transfer data. Meskipun ini sedikit meningkatkan waktu transfer, kami merekomendasikan agar Anda tetap mengaktifkannya di lingkungan produksi untuk memastikan konsistensi data. Pertimbangkan untuk menonaktifkan pemeriksaan CRC untuk meningkatkan performa dalam skenario tertentu, seperti streaming pratinjau langsung, data real-time dari perangkat IoT, video pengawasan berkualitas rendah di mana kehilangan data kecil dapat ditoleransi, atau transfer data batch di jaringan internal yang sangat andal. Sebelum menonaktifkan pemeriksaan CRC, Anda harus sepenuhnya menilai risiko ketidaksesuaian data dan melakukan pengujian lengkap.

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Nonaktifkan fitur pemeriksaan data CRC. Gunakan ini dengan hati-hati dan sepenuhnya evaluasi risikonya.
clientBuilderConfiguration.setCrcCheckEnabled(false); 

OSS ossClient = new OSSClientBuilder()
    // Konfigurasi lain...
    .clientConfiguration(clientBuilderConfiguration)
    .build();

Pola singleton

Saat menggunakan OSS SDK for Java 1.0, gunakan pola singleton untuk membuat dan menggunakan instance OSSClient.

  • OSSClient bersifat thread-safe, yang memungkinkan beberapa thread mengakses instance yang sama. Anda dapat menggunakan pola singleton untuk membuat dan menggunakan kembali instance OSSClient berdasarkan kebutuhan bisnis Anda. Ini menghindari overhead pembuatan dan penghancuran instance secara sering.

  • Instance OSSClient mempertahankan kolam koneksi secara internal. Ketika instance OSSClient tidak lagi diperlukan, Anda harus memanggil metode shutdown untuk menutupnya dan mencegah kehabisan sumber daya karena terlalu banyak instance yang dibuat.

import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.internal.OSSHeaders;
import com.aliyun.oss.model.*;
import java.io.ByteArrayInputStream;

public class OssClientSingleton {
    private OssClientSingleton() {}

    // Implementasi singleton dengan kelas statis internal (thread-safe)
    private static class SingletonHolder {
        private static final OSS INSTANCE = create();

        private static OSS create() {
            try {
                // Wilayah China (Hangzhou) digunakan sebagai contoh. Untuk wilayah lain, tentukan endpoint sebenarnya.
                String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
                // Masukkan wilayah tempat bucket berada. Wilayah China (Hangzhou) digunakan sebagai contoh. Setel wilayah ke cn-hangzhou.
                String region = "cn-hangzhou";

                ClientBuilderConfiguration config = new ClientBuilderConfiguration();
                // Secara eksplisit deklarasikan penggunaan algoritma tanda tangan V4.
                config.setSignatureVersion(SignVersion.V4);

                // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel.
                CredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();

                // Bangun klien OSS.
                return OSSClientBuilder.create()
                        .endpoint(endpoint)
                        .credentialsProvider(credentialsProvider)
                        .clientConfiguration(config)
                        .region(region)
                        .build();
            } catch (Exception e) {
                throw new RuntimeException("Gagal menginisialisasi klien OSS", e);
            }
        }
    }

    // Dapatkan instance singleton.
    public static OSS getInstance() {
        return SingletonHolder.INSTANCE;
    }

    // Uji operasi PutObject di fungsi utama.
    public static void main(String[] args) {
        // Dapatkan klien OSS singleton.
        OSS ossClient = OssClientSingleton.getInstance();

        // Masukkan nama bucket, seperti examplebucket.
        String bucketName = "examplebucket";
        // Masukkan jalur lengkap objek, tidak termasuk nama bucket, seperti testfolder/exampleobject.txt.
        String objectKey = "testfolder/exampleobject.txt";

        try {
            // Masukkan string.
            String content = "Hello OSS";

            // Buat objek PutObjectRequest.
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectKey, new ByteArrayInputStream(content.getBytes()));

            // Untuk menyetel kelas penyimpanan dan izin akses selama unggah, lihat kode contoh berikut.
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            metadata.setObjectAcl(CannedAccessControlList.Private);
            putObjectRequest.setMetadata(metadata);

            // Unggah string.
            PutObjectResult result = ossClient.putObject(putObjectRequest);
            // Cetak hasil unggah.
            System.out.println("File berhasil diunggah!");
            System.out.println("ETag: " + result.getETag());
            System.out.println("ID Permintaan: " + result.getRequestId());
        } catch (OSSException oe) {
            System.out.println("Tangkap OSSException, yang berarti permintaan Anda sampai di OSS, "
                    + "tetapi ditolak dengan respons kesalahan karena suatu alasan.");
            System.out.println("Pesan Kesalahan:" + oe.getErrorMessage());
            System.out.println("Kode Kesalahan:" + oe.getErrorCode());
            System.out.println("ID Permintaan:" + oe.getRequestId());
            System.out.println("ID Host:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Tangkap ClientException, yang berarti klien mengalami "
                    + "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
                    + "seperti tidak dapat mengakses jaringan.");
            System.out.println("Pesan Kesalahan:" + ce.getMessage());
        } finally {
            // Dalam mode singleton, jangan tutup klien setelah setiap operasi (untuk menggunakan kembali koneksi), karena ini dapat memengaruhi penggunaan berikutnya.
            // Saat instance OSSClient tidak lagi diperlukan (misalnya, sebelum aplikasi keluar), panggil metode shutdown sekali untuk melepaskan sumber daya.
            // ossClient.shutdown();
        }
    }
}

Penanganan pengecualian

OSS SDK for Java 1.0 mencakup dua jenis pengecualian: ClientException dan OSSException. Keduanya merupakan turunan dari RuntimeException.

Pengecualian klien (ClientException)

Pengecualian klien terjadi selama pembuatan permintaan, pengiriman, atau transfer data. Skenario umum meliputi:

  • Koneksi jaringan tidak tersedia, yang mencegah permintaan dikirim ke server.

  • Terjadi pengecualian IO selama unggah file.

  • Pengecualian jaringan dasar terjadi, seperti timeout permintaan atau kegagalan verifikasi sertifikat.

ClientException menunjukkan bahwa permintaan tidak berhasil dikirim ke server OSS atau terjadi kesalahan selama pemrosesan di sisi klien. Ini biasanya memerlukan pemeriksaan status koneksi jaringan, konfigurasi klien, atau mekanisme percobaan ulang.

Pengecualian server (OSSException)

Pengecualian server dikembalikan oleh server OSS. Ini berarti permintaan berhasil dikirim dan diterima oleh server tetapi tidak dapat diproses karena suatu alasan. Pengecualian server OSS memiliki karakteristik berikut:

  • Termasuk kode kesalahan dan pesan kesalahan terperinci untuk identifikasi masalah yang tepat.

  • Kesalahan umum meliputi SignatureDoesNotMatch, AccessDenied, dan NoSuchKey.

  • Menangani pengecualian ini berdasarkan kode kesalahan dapat secara signifikan meningkatkan ketahanan program dan pengalaman pengguna.

Kami merekomendasikan Anda menangkap kedua jenis pengecualian ini secara terpisah selama pengembangan untuk lebih akurat mengidentifikasi sumber masalah dan membuat strategi penanganan yang sesuai.

// Buat operasi klien...

try {
    // Lakukan operasi OSS, seperti mengunggah file, mengunduh file, atau mencantumkan objek.
    // Operasi ini dapat memunculkan pengecualian terkait OSS.
    ossClient.putObject(...);
    
} catch (OSSException oe) {
    // Tangkap pengecualian yang dikembalikan oleh server OSS.
    // Pengecualian ini dilemparkan ketika permintaan berhasil mencapai server OSS, tetapi server menolak permintaan tersebut.
    // Penyebab umum: izin tidak cukup, parameter salah, sumber daya tidak ada, dll.
    System.out.println("Tangkap OSSException, yang berarti permintaan Anda sampai di OSS, "
            + "tetapi ditolak dengan respons kesalahan karena suatu alasan.");
    
    // Keluarkan informasi kesalahan terperinci untuk lokasi masalah dan debugging.
    System.out.println("Pesan Kesalahan: " + oe.getErrorMessage());   
    System.out.println("Kode Kesalahan:       " + oe.getErrorCode());  
    System.out.println("ID Permintaan:      " + oe.getRequestId());     
    System.out.println("ID Host:           " + oe.getHostId());      
    
} catch (ClientException ce) {
    // Tangkap pengecualian klien.
    // Pengecualian ini dilemparkan ketika klien mengalami masalah internal serius saat mencoba berkomunikasi dengan OSS.
    // Penyebab umum: masalah koneksi jaringan, masalah sertifikat SSL, kegagalan resolusi DNS, dll.
    System.out.println("Tangkap ClientException, yang berarti klien mengalami "
            + "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
            + "seperti tidak dapat mengakses jaringan.");
    
    // Keluarkan informasi terperinci tentang pengecualian klien.
    System.out.println("Pesan Kesalahan: " + ce.getMessage());  
    
} finally {
    // Lepaskan sumber daya klien terlepas dari apakah operasi berhasil atau gagal.
    // Ini adalah praktik terbaik untuk menghindari kebocoran sumber daya dan kehabisan kolam koneksi.
    if (ossClient != null) {
        ossClient.shutdown();  // Tutup klien untuk melepaskan koneksi jaringan dan sumber daya lainnya.
    }
}

Kode contoh

OSS SDK for Java 1.0 menyediakan berbagai kode contoh yang mencakup fitur inti seperti manajemen bucket, operasi file, kontrol akses, dan transfer terenkripsi untuk referensi atau penggunaan langsung Anda. Kode contoh mencakup hal-hal berikut:

File contoh

Isi contoh

BucketOperationsSample.java

BucketTaggingSample.java

Tagging bucket (Java SDK)

BucketInventorySample.java

Inventaris bucket (Java SDK)

BucketPolicySample.java

Kebijakan bucket (Java SDK)

BucketWormSample.java

Kebijakan retensi (Java SDK)

SetRequestPaymentSample.java

Pembayaran berdasarkan permintaan (Java SDK)

BucketReplicationSample.java

Replikasi data (Java SDK)

BucketTransferAccelerationSample.java

Akselerasi transfer (Java SDK)

CreateFolderSample.java

Unggah sederhana (Java SDK)

PostObjectSample.java

Unggah formulir (Java SDK)

Catatan

Implementasi PostObject tidak bergantung pada Java SDK.

AppendObjectSample.java

Unggah tambahan (Java SDK)

UploadSample.java

Unggah yang dapat dilanjutkan (Java SDK)

MultipartUploadSample.java

Unggah multipart (Java SDK)

CallbackSample.java

Panggilan balik unggah (Java SDK)

SimpleGetObjectSample.java

Unduh file (Java SDK)

DownloadSample.java

Unduhan yang dapat dilanjutkan (Java SDK)

ConcurrentGetObjectSample.java

Unduhan yang dapat dilanjutkan (Java SDK)

GetProgressSample.java

GetStartedSample.java

ObjectMetaSample.java

Kelola metadata file (Java SDK)

StorageTypeSample.java

Ubah kelas penyimpanan file (Java SDK)

ListObjectsSample.java

Daftar file (Java SDK)

BucketMetaQuerySample.java

Pengambilan skalar (Java SDK)

SelectObjectSample.java

Kueri file (Java SDK)

DeleteObjectsSample.java

Hapus file (Java SDK)

UploadPartCopySample.java

Salin file (Java SDK)

ObjectOperationSample.java

Cegah menimpa file dengan nama yang sama (Java SDK)

RestoreObjectSample.java

Pulihkan file (Java SDK)

SymLinkSample.java

Kelola tautan simbolik (Java SDK)

BucketVersioningSample.java

Kelola pengendalian versi (Java SDK)

ObjectTaggingSample.java

TrafficLimitSample.java

Pembatasan bandwidth satu koneksi (Java SDK)

Enkripsi berbasis klien (Java SDK)

EncryptionServiceSample.java

Enkripsi server-side (Java SDK)

AuthorizedAccessSample.java

Unduh menggunakan URL yang ditandatangani (Java SDK)

CRCSample.java

Validasi data (Java SDK)

ImageSample.java

Pemrosesan gambar (Java SDK)

Konfigurasi kredensial akses

OSS menyediakan beberapa cara untuk menginisialisasi kredensial. Pilih metode inisialisasi berdasarkan kebutuhan otentikasi dan otorisasi Anda.

Bagaimana cara memilih kredensial akses?

Metode inisialisasi penyedia kredensial

Skenario

Memerlukan Pasangan AccessKey atau token STS yang sudah ada sebelumnya

Kredensial dasar

Masa berlaku kredensial

Metode rotasi atau pembaruan kredensial

Gunakan Pasangan AccessKey dari Pengguna RAM

Aplikasi yang diterapkan di lingkungan aman dan stabil yang tidak rentan terhadap serangan eksternal dan memerlukan akses jangka panjang ke layanan Alibaba Cloud tanpa rotasi kredensial yang sering.

Ya

Access Key (AK)

Jangka panjang

Rotasi manual

Gunakan token STS

Aplikasi yang diterapkan di lingkungan tidak tepercaya dan memerlukan kontrol durasi akses serta izin.

Ya

Token Layanan Token Keamanan

Sementara

Pembaruan manual

Gunakan RAMRoleARN

Aplikasi yang memerlukan akses berizin ke OSS, seperti untuk akses lintas akun.

Ya

Token Layanan Token Keamanan

Sementara

Pembaruan otomatis

Gunakan ECSRAMRole

Aplikasi yang berjalan pada instance ECS Alibaba Cloud, instance ECI, atau node pekerja Container Service for Kubernetes (CSK).

Tidak

Token Layanan Token Keamanan

Sementara

Pembaruan otomatis

Gunakan OIDCRoleARN

Aplikasi tidak tepercaya yang diterapkan pada node pekerja Container Service for Kubernetes Alibaba Cloud.

Tidak

Token Layanan Token Keamanan

Sementara

Pembaruan otomatis

Gunakan kredensial dari konteks Function Compute

Fungsi aplikasi yang diterapkan di Function Compute Alibaba Cloud.

Tidak

Token Layanan Token Keamanan

Sementara

Tidak perlu pembaruan

Gunakan CredentialsURI

Aplikasi yang memerlukan kredensial akses dari sistem eksternal.

Tidak

Token Layanan Token Keamanan

Sementara

Pembaruan otomatis

Gunakan Pasangan AccessKey yang berputar otomatis

Aplikasi yang memerlukan akses jangka panjang ke OSS tetapi diterapkan di lingkungan dengan risiko kebocoran Pasangan AccessKey yang memerlukan rotasi manual sering.

Tidak

AccessKey (AK)

Jangka panjang

Rotasi otomatis

Gunakan kredensial akses kustom

Jika metode konfigurasi kredensial sebelumnya tidak memenuhi persyaratan Anda, sesuaikan cara Anda mendapatkan kredensial.

Kustom

Pasangan AccessKey atau Token Layanan Token Keamanan

Kustom

Kustom

Gunakan rantai kredensial default

Saat Anda menginisialisasi klien kredensial tanpa melewatkan parameter apa pun, alat Kredensial menggunakan rantai kredensial default untuk menginisialisasi klien.

Tidak

Pasangan AccessKey atau Token Layanan Token Keamanan

Kustom

Pembaruan otomatis

Gunakan Pasangan AccessKey dari Pengguna RAM

Metode ini digunakan untuk aplikasi yang diterapkan di lingkungan aman dan stabil, tidak rentan terhadap serangan eksternal, memerlukan akses jangka panjang ke OSS, dan tidak dapat memiliki kredensial mereka yang sering diputar. Anda dapat menginisialisasi penyedia kredensial dengan Pasangan AccessKey (AccessKey ID dan AccessKey secret) dari akun Alibaba Cloud atau Pengguna RAM. Metode ini memerlukan Anda secara manual memelihara Pasangan AccessKey, yang meningkatkan risiko keamanan dan kompleksitas pemeliharaan.

Penting
  • Akun Alibaba Cloud memiliki izin penuh atas sumber dayanya. Jika Pasangan AccessKey bocor, itu menimbulkan risiko besar bagi sistem Anda. Kami tidak merekomendasikan menggunakan Pasangan AccessKey dari akun Alibaba Cloud. Sebagai gantinya, gunakan Pasangan AccessKey dari Pengguna RAM dengan izin minimum yang diperlukan.

  • Untuk membuat Pasangan AccessKey untuk Pengguna RAM, lihat Buat Pasangan AccessKey. AccessKey ID dan AccessKey secret dari Pengguna RAM hanya ditampilkan saat Pasangan AccessKey dibuat. Anda harus menyimpannya segera. Jika Anda lupa, Anda harus membuat Pasangan AccessKey baru untuk menggantinya.

Variabel lingkungan

  1. Gunakan Pasangan AccessKey dari Pengguna RAM untuk mengonfigurasi variabel lingkungan.

    Linux

    1. Jalankan perintah berikut di Antarmuka baris perintah untuk menambahkan pengaturan Variabel lingkungan ke file ~/.bashrc .

      echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc
      echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc
    2. Jalankan perintah berikut untuk menerapkan perubahan.

      source ~/.bashrc
    3. Jalankan perintah berikut untuk memverifikasi bahwa Variabel lingkungan telah dikonfigurasi.

      echo $OSS_ACCESS_KEY_ID
      echo $OSS_ACCESS_KEY_SECRET

    macOS

    1. Jalankan perintah berikut di terminal untuk melihat jenis shell default.

      echo $SHELL
    2. Lakukan operasi berikut berdasarkan jenis shell default.

      Zsh

      1. Jalankan perintah berikut untuk menambahkan pengaturan variabel lingkungan ke file ~/.zshrc.

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
      2. Jalankan perintah berikut untuk menerapkan perubahan.

        source ~/.zshrc
      3. Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

      Bash

      1. Jalankan perintah berikut untuk menambahkan pengaturan variabel lingkungan ke file ~/.bash_profile.

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile
      2. Jalankan perintah berikut untuk menerapkan perubahan.

        source ~/.bash_profile
      3. Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

    Windows

    CMD

    1. Jalankan perintah berikut di CMD.

      setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID"
      setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
    2. Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.

      echo %OSS_ACCESS_KEY_ID%
      echo %OSS_ACCESS_KEY_SECRET%

    PowerShell

    1. Jalankan perintah berikut di PowerShell.

      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
    2. Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.

      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
  2. Setelah Anda memodifikasi variabel lingkungan sistem, mulai ulang atau segarkan lingkungan pengembangan Anda, termasuk IDE, antarmuka baris perintah, aplikasi desktop lainnya, dan layanan backend, untuk memastikan variabel lingkungan sistem terbaru dimuat dengan sukses.

  3. Gunakan variabel lingkungan untuk mengirimkan informasi kredensial.

    import com.aliyun.oss.ClientBuilderConfiguration;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.common.auth.CredentialsProviderFactory;
    import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
    import com.aliyun.oss.common.comm.SignVersion;
    
    public class AkDemoTest {
        public static void main(String[] args) throws Exception {
            // Dapatkan kredensial dari variabel lingkungan.
            EnvironmentVariableCredentialsProvider credentialsProvider =  CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
            // Gunakan credentialsProvider untuk operasi selanjutnya...
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);   
            // Buat instans OSSClient.
            // Saat instans OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya.
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
                    
            ossClient.shutdown();
        }
    }

Kredensial statis

Kode sampel berikut menunjukkan cara mengkodekan kredensial akses secara langsung dan secara eksplisit menetapkan Pasangan Kunci Akses untuk digunakan.

Penting

Jangan sematkan kredensial akses dalam aplikasi di lingkungan produksi. Metode ini hanya untuk tujuan pengujian.

import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;

public class AkDemoTest {
    public static void main(String[] args) throws Exception {
        // Masukkan ID AccessKey dan Rahasia AccessKey dari Pengguna RAM.
        String accessKeyId = "yourAccessKeyID";
        String accessKeySecret = "yourAccessKeySecret";
        
        // Gunakan metode DefaultCredentialProvider untuk langsung menetapkan ID AccessKey dan Rahasia AccessKey.
        CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);

        // Gunakan credentialsProvider untuk menginisialisasi klien.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // Deklarasikan secara eksplisit penggunaan algoritma tanda tangan V4.
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
        // Buat instans OSSClient.
        // Saat instans OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya.
        OSS ossClient = OSSClientBuilder.create()
                .endpoint("endpoint")
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region("region")
                .build();

        ossClient.shutdown();

    }
}

Gunakan token STS

Metode ini untuk aplikasi yang memerlukan akses sementara ke OSS. Inisialisasi penyedia kredensial dengan kredensial identitas sementara (AccessKey ID, AccessKey secret, dan token keamanan) yang Anda peroleh dari Layanan Token Keamanan (STS). Metode ini mengharuskan Anda secara manual memelihara token STS, yang meningkatkan risiko keamanan dan kompleksitas pemeliharaan. Untuk mengakses OSS sementara beberapa kali, Anda harus secara manual memperbarui token STS.

Penting

Variabel lingkungan

  1. Gunakan kredensial identitas sementara untuk mengatur variabel lingkungan.

    Mac OS/Linux/Unix

    Penting
    • Catat bahwa kredensial identitas sementara (AccessKey ID, AccessKey secret, dan token keamanan) yang diperoleh dari layanan STS digunakan di sini, bukan Pasangan Kunci Akses Pengguna RAM.

    • Catat bahwa AccessKey ID yang diperoleh dari layanan STS dimulai dengan "STS", seperti "STS.****************".

    export OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID>
    export OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET>
    export OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>

    Windows

    Penting
    • Catat bahwa kredensial identitas sementara (AccessKey ID, AccessKey secret, dan token keamanan) yang diperoleh dari layanan STS digunakan di sini, bukan Pasangan Kunci Akses (AccessKey ID dan AccessKey secret) Pengguna RAM.

    • Catat bahwa AccessKey ID yang diperoleh dari layanan STS dimulai dengan "STS", seperti "STS.****************".

    set OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID>
    set OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET>
    set OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>
  2. Teruskan informasi kredensial melalui variabel lingkungan.

    import com.aliyun.oss.ClientBuilderConfiguration;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.common.auth.CredentialsProviderFactory;
    import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
    import com.aliyun.oss.common.comm.SignVersion;
    
    public class StsDemoTest {
        public static void main(String[] args) throws Exception {
            // Dapatkan kredensial dari variabel lingkungan.
            EnvironmentVariableCredentialsProvider credentialsProvider =  CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
            
            // Gunakan credentialsProvider untuk menginisialisasi klien.
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // Secara eksplisit nyatakan penggunaan algoritma tanda tangan V4.
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // Buat instans OSSClient.
            // Saat instans OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya.
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
        }
    }

Kredensial statis

Tulis kode kredensial secara langsung dalam aplikasi Anda dan atur secara eksplisit kunci akses sementara yang akan digunakan.

import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;

public class StsDemoTest {
    public static void main(String[] args) throws Exception {
        // Atur ini ke AccessKey ID sementara, AccessKey secret, dan token keamanan yang diperoleh dari layanan STS, bukan informasi kredensial Pengguna RAM.
        // Catat bahwa AccessKey ID yang diperoleh dari layanan STS dimulai dengan "STS", seperti yang ditunjukkan di bawah ini.
        String accessKeyId = "STS.****************";
        String accessKeySecret = "yourAccessKeySecret";
        String stsToken= "yourSecurityToken";

        // Gunakan metode DefaultCredentialProvider untuk langsung mengatur AccessKey ID dan AccessKey secret.
        CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret, stsToken);

        // Gunakan credentialsProvider untuk menginisialisasi klien.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // Secara eksplisit nyatakan penggunaan algoritma tanda tangan V4.
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        // Buat instans OSSClient.
        // Saat instans OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya.
        OSS ossClient = OSSClientBuilder.create()
                .endpoint("endpoint")
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region("region")
                .build();

        ossClient.shutdown();
    }
}

Gunakan RAMRoleARN

Metode ini digunakan untuk aplikasi yang memerlukan akses terotorisasi ke OSS, seperti untuk akses lintas akun. Inisialisasi penyedia kredensial dengan menentukan Nama Sumber Daya Alibaba Cloud (ARN) dari peran RAM. Implementasi dasarnya didasarkan pada token STS. Alat Kredensial mendapatkan token STS dari layanan STS dan memanggil operasi API AssumeRole untuk meminta token STS baru sebelum yang saat ini kedaluwarsa. Anda juga dapat memberikan nilai pada parameter policy untuk membatasi peran RAM menjadi set izin yang lebih kecil.

Penting
  • Akun Alibaba Cloud memiliki izin penuh atas sumber dayanya. Jika pasangan AccessKey bocor, hal itu menimbulkan risiko besar bagi sistem Anda. Kami tidak merekomendasikan penggunaan pasangan AccessKey dari akun Alibaba Cloud. Sebagai gantinya, gunakan pasangan AccessKey dari Pengguna RAM dengan izin minimum yang diperlukan.

  • Untuk membuat pasangan AccessKey untuk Pengguna RAM, lihat Buat pasangan AccessKey. ID AccessKey dan Rahasia AccessKey dari Pengguna RAM hanya ditampilkan saat pasangan AccessKey dibuat. Anda harus menyimpannya segera. Jika Anda lupa, Anda harus membuat pasangan AccessKey baru untuk menggantikan yang lama.

  • Untuk mendapatkan RAMRoleARN, lihat CreateRole - Buat peran RAM.

  1. Tambahkan dependensi kredensial.

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>LATEST</version>
    </dependency>
  2. Konfigurasikan pasangan AccessKey dan RAMRoleARN sebagai kredensial akses.

    import com.aliyun.credentials.models.CredentialModel;
    import com.aliyun.oss.ClientBuilderConfiguration;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    import com.aliyun.oss.common.comm.SignVersion;
    
    public class RamRoleArnAkDemoTest {
    
        public static void main(String[] args) {
    
            com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config();
            // Jenis kredensial akses. Atur ke ram_role_arn.
            config.setType("ram_role_arn");
            // ARN dari peran RAM untuk diasumsikan. Contoh: acs:ram::123456789012****:role/adminrole. Anda dapat mengatur RoleArn melalui variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
            config.setRoleArn("<RoleArn>");
            // Dapatkan ID AccessKey dari variabel lingkungan.
            config.setAccessKeyId(System.getenv().get("ALIBABA_CLOUD_ACCESS_KEY_ID"));
            // Dapatkan Rahasia AccessKey dari variabel lingkungan.
            config.setAccessKeySecret(System.getenv().get("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
            // Nama sesi peran. Anda dapat mengatur RoleSessionName melalui variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
            config.setRoleName("<RoleSessionName>");
            // Tetapkan kebijakan izin yang lebih kecil. Ini opsional. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
            config.setPolicy("<Policy>");
            // Tetapkan periode validitas sesi peran. Ini opsional.
            config.setRoleSessionExpiration(3600);
    
            final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config);
    
            CredentialsProvider credentialsProvider = new CredentialsProvider(){
                @Override
                public void setCredentials(Credentials credentials) {
                }
    
                @Override
                public Credentials getCredentials() {
                    CredentialModel credential = credentialsClient.getCredential();
                    return  new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken());
                }
            };
            // Gunakan credentialsProvider untuk menginisialisasi klien.
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // Secara eksplisit nyatakan penggunaan algoritma tanda tangan V4.
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // Buat instans OSSClient.
            // Saat instans OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya.
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("Titik akhir")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("Wilayah")
                    .build();
    
            ossClient.shutdown();
        }
    }

Gunakan ECSRAMRole

Metode ini ditujukan untuk aplikasi yang berjalan pada instance ECS, instance ECI, atau node pekerja dari Container Service for Kubernetes (CSK). Kami merekomendasikan Anda menginisialisasi penyedia kredensial dengan ECSRAMRole. Implementasi dasarnya didasarkan pada token STS. ECSRAMRole memungkinkan Anda menyambungkan peran ke instance ECS, instance ECI, atau node pekerja dari CSK, yang memungkinkan pembaruan otomatis token STS di dalam instans. Metode ini menghilangkan risiko pemeliharaan manual terhadap pasangan Kunci Akses atau token STS karena Anda tidak perlu menyediakannya. Untuk mendapatkan ECSRAMRole, lihat CreateRole - Buat Peran RAM. Untuk menyambungkan peran ke instance ECS, lihat Peran RAM Instans.

  1. Tambahkan dependensi kredensial.

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>TERBARU</version>
    </dependency>
  2. Konfigurasikan ECSRAMRole sebagai kredensial akses.

    import com.aliyun.credentials.models.CredentialModel;
    import com.aliyun.oss.ClientBuilderConfiguration;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    import com.aliyun.oss.common.comm.SignVersion;
    
    public class EcsRamRoleDemoTest {
        public static void main(String[] args) {
    
            com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config();
            // Jenis kredensial akses. Atur ke ecs_ram_role.
            config.setType("ecs_ram_role");
            // Nama peran RAM yang ditetapkan ke instance ECS.
            config.setRoleName("<RoleName>");
    
            final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config);
    
            CredentialsProvider credentialsProvider = new CredentialsProvider(){
                @Override
                public void setCredentials(Credentials credentials) {
                }
    
                @Override
                public Credentials getCredentials() {
                    CredentialModel credential = credentialsClient.getCredential();
                    return  new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken());
                }
            };
            // Gunakan credentialsProvider untuk menginisialisasi klien.
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // Secara eksplisit nyatakan penggunaan algoritma tanda tangan V4.
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // Buat instans OSSClient.
            // Saat instans OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya.
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("Titik akhir")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("Wilayah")
                    .build();
    
            ossClient.shutdown();
        }
    }

Gunakan OIDCRoleARN

Setelah Anda mengonfigurasi peran RAM node pekerja di Container Service for Kubernetes (CSK), aplikasi dalam pod pada node yang sesuai dapat memperoleh token STS dari peran yang disambungkan melalui Metadata Server, sama seperti aplikasi yang diterapkan pada ECS. Namun, jika aplikasi yang tidak tepercaya diterapkan pada kluster kontainer (misalnya, aplikasi yang dikirimkan oleh pelanggan Anda dengan kode yang tidak terbuka untuk Anda), Anda mungkin tidak ingin mereka memperoleh token STS dari peran RAM instans node pekerja yang disambungkan melalui Metadata Server. Untuk menghindari memengaruhi keamanan sumber daya cloud Anda sambil tetap memungkinkan aplikasi yang tidak tepercaya ini secara aman memperoleh token STS yang diperlukan dan mencapai minimalisasi izin pada tingkat aplikasi, gunakan fitur RAM Roles for Service Accounts (RRSA). Implementasi dasar metode ini didasarkan pada token STS. Kluster kontainer Alibaba Cloud membuat dan memasang file token OpenID Connect (OIDC) akun layanan yang sesuai untuk pod aplikasi yang berbeda dan menyuntikkan informasi konfigurasi terkait ke dalam variabel lingkungan. Alat Credentials memperoleh token STS dari peran yang terikat dengan memanggil operasi API AssumeRoleWithOIDC dari layanan STS menggunakan informasi konfigurasi dari variabel lingkungan. Metode ini menghilangkan risiko pemeliharaan manual pasangan AccessKey atau token STS karena Anda tidak perlu menyediakannya. Untuk informasi lebih lanjut, lihat Konfigurasikan izin RAM untuk ServiceAccount melalui RRSA untuk mencapai isolasi izin pod.

  1. Tambahkan dependensi credentials.

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>TERBARU</version>
    </dependency>
  2. Konfigurasikan peran RAM OIDC sebagai kredensial akses.

    import com.aliyun.credentials.models.CredentialModel;
    import com.aliyun.oss.ClientBuilderConfiguration;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    import com.aliyun.oss.common.comm.SignVersion;
    
    public class OidcRoleArnDemoTest {
        public static void main(String[] args) {
    
            com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config();
            // Tentukan tipe Credential. Atur ke oidc_role_arn.
            config.setType("oidc_role_arn");
            // ARN dari peran RAM. Anda dapat mengatur RoleArn melalui variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
            config.setRoleArn("<RoleArn>");
            // ARN dari penyedia OIDC. Anda dapat mengatur OidcProviderArn melalui variabel lingkungan ALIBABA_CLOUD_OIDC_PROVIDER_ARN.
            config.setOidcProviderArn("<OidcProviderArn>");
            // Jalur ke file token OIDC. Anda dapat mengatur OidcTokenFilePath melalui variabel lingkungan ALIBABA_CLOUD_OIDC_TOKEN_FILE.
            config.setOidcTokenFilePath("<OidcTokenFilePath>");
            // Nama sesi peran. Anda dapat mengatur RoleSessionName melalui variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
            config.setRoleSessionName("<RoleSessionName>");
            // Atur kebijakan izin yang lebih kecil. Ini opsional. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
            config.setPolicy("<Policy>");
            // Atur waktu kedaluwarsa sesi.
            config.setRoleSessionExpiration(3600);
    
            final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config);
    
            CredentialsProvider credentialsProvider = new CredentialsProvider(){
                @Override
                public void setCredentials(Credentials credentials) {
                }
    
                @Override
                public Credentials getCredentials() {
                    CredentialModel credential = credentialsClient.getCredential();
                    return  new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken());
                }
            };
            // Gunakan credentialsProvider untuk menginisialisasi klien.
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // Nyatakan secara eksplisit penggunaan algoritma tanda tangan V4.
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // Buat instance OSSClient.
            // Saat instance OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya.
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("titik akhir")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("wilayah")
                    .build();
    
            ossClient.shutdown();
        }
    }

Gunakan kredensial dari konteks Function Compute

Metode ini digunakan untuk fungsi aplikasi yang diterapkan di Function Compute. Inisialisasi penyedia kredensial dengan kredensial dari konteks Function Compute. Implementasi dasarnya didasarkan pada token STS. Function Compute memperoleh token STS dengan mengasumsikan peran layanan yang dikonfigurasi untuk fungsi tersebut dan kemudian meneruskan token STS ke aplikasi Anda melalui parameter Kredensial dalam konteks. Token STS ini berlaku selama 36 jam dan tidak dapat diubah. Waktu eksekusi maksimum untuk sebuah fungsi adalah 24 jam, sehingga token STS tidak akan kedaluwarsa selama eksekusi fungsi, dan Anda tidak perlu mempertimbangkan untuk menyegarkannya. Metode ini menghilangkan risiko pemeliharaan manual terhadap pasangan AccessKey atau token STS karena Anda tidak perlu menyediakannya. Untuk memberikan izin kepada Function Compute untuk mengakses OSS, lihat Gunakan peran fungsi untuk memberikan izin Function Compute mengakses layanan Alibaba Cloud lainnya.

  1. Tambahkan dependensi konteks Function Compute.

    <!-- https://mvnrepository.com/artifact/com.aliyun.fc.runtime/fc-java-core -->
    <dependency>
        <groupId>com.aliyun.fc.runtime</groupId>
        <artifactId>fc-java-core</artifactId>
        <version>1.4.1</version>
    </dependency>
  2. Inisialisasi penyedia kredensial dengan kredensial dari konteks Function Compute.

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import com.aliyun.fc.runtime.Context;
    import com.aliyun.fc.runtime.Credentials;
    import com.aliyun.fc.runtime.StreamRequestHandler;
    import com.aliyun.oss.ClientBuilderConfiguration;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.common.auth.*;
    import com.aliyun.oss.common.comm.SignVersion;
    
    public class App implements StreamRequestHandler {
    
        @Override
        public void handleRequest(
            InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
    
            // Dapatkan informasi kunci. Sebelum eksekusi, pastikan layanan tempat fungsi berada telah dikonfigurasi dengan informasi peran, dan peran tersebut memiliki izin OSS yang diperlukan. Kami merekomendasikan penggunaan peran AliyunFCDefaultRole.
            Credentials creds = context.getExecutionCredentials();
    
            // Gunakan kredensial yang diperoleh untuk membuat instance penyedia kredensial.
            CredentialsProvider credentialsProvider = new DefaultCredentialProvider(creds.getAccessKeyId(), creds.getAccessKeySecret(), creds.getSecurityToken());
    
            // Gunakan credentialsProvider untuk menginisialisasi klien.
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // Secara eksplisit nyatakan penggunaan algoritma tanda tangan V4.
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // Buat instance OSSClient.
            // Saat instance OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya.
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("Titik akhir")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("Wilayah")
                    .build();
    
            ossClient.shutdown();
    
            outputStream.write(new String("selesai").getBytes());
        }
    }

Gunakan CredentialsURI

Metode ini ditujukan untuk aplikasi yang perlu mengambil kredensial Alibaba Cloud dari sistem eksternal untuk manajemen kredensial yang fleksibel dan akses tanpa kunci. Anda dapat menginisialisasi penyedia kredensial dengan CredentialsURI. Implementasi dasarnya didasarkan pada token STS. Alat Credentials memperoleh token STS dari URI yang Anda berikan untuk menginisialisasi klien kredensial. Metode ini menghilangkan risiko pemeliharaan manual Pasangan Kunci Akses atau token STS karena Anda tidak perlu menyediakannya.

  1. Agar alat Credentials dapat mengurai dan menggunakan token STS dengan benar, URI harus mengikuti protokol tanggapan ini:

    • Kode status tanggapan: 200

    • Struktur badan tanggapan:

      {
          "Code": "Success",
          "AccessKeySecret": "AccessKeySecret",
          "AccessKeyId": "AccessKeyId",
          "Expiration": "2021-09-26T03:46:38Z",
          "SecurityToken": "SecurityToken"
      }
  2. Tambahkan dependensi kredensial.

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>TERBARU</version>
    </dependency>
  3. Konfigurasikan CredentialsURI sebagai kredensial akses.

    import com.aliyun.credentials.models.CredentialModel;
    import com.aliyun.oss.ClientBuilderConfiguration;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    import com.aliyun.oss.common.comm.SignVersion;
    
    public class CredentialsUriDemoTest {
        public static void main(String[] args) {
    
            com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config();
            // Jenis kredensial akses. Atur ke credentials_uri.
            config.setType("credentials_uri");
            // URI kredensial, yaitu alamat server Anda yang menghasilkan token STS, dalam format http://local_or_remote_uri/. Anda dapat menyetel CredentialsUri melalui variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI.
            config.setCredentialsUri("<CredentialsUri>");
    
            final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config);
    
            CredentialsProvider credentialsProvider = new CredentialsProvider(){
                @Override
                public void setCredentials(Credentials credentials) {
                }
    
                @Override
                public Credentials getCredentials() {
                    CredentialModel credential = credentialsClient.getCredential();
                    return  new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken());
                }
            };
            // Gunakan credentialsProvider untuk menginisialisasi klien.
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // Secara eksplisit nyatakan penggunaan algoritma tanda tangan V4.
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // Buat instans OSSClient.
            // Saat instans OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya.
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("Titik akhir")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("Wilayah")
                    .build();
    
            ossClient.shutdown();
        }
    }

Gunakan Pasangan Kunci Akses yang Berotasi Otomatis

Metode ini ditujukan untuk aplikasi yang memerlukan akses jangka panjang ke OSS tetapi diterapkan di lingkungan dengan risiko kebocoran Pasangan Kunci Akses yang memerlukan rotasi manual secara berkala. Inisialisasi penyedia kredensial dengan ClientKey. Implementasi dasarnya didasarkan pada Pasangan Kunci Akses. Saat menggunakan ClientKey, Key Management Service (KMS) dapat secara otomatis dan berkala merotasi Pasangan Kunci Akses Pengguna RAM yang dikelola, mengubah Pasangan Kunci Akses RAM statis menjadi dinamis, sehingga mengurangi risiko kebocoran. Selain rotasi berkala, KMS juga mendukung rotasi segera, yang memungkinkan penggantian cepat Pasangan Kunci Akses jika terjadi kebocoran. Metode ini menghilangkan risiko dan kompleksitas pemeliharaan manual Pasangan Kunci Akses. Untuk mendapatkan ClientKey, lihat Buat titik akses aplikasi.

  1. Tambahkan dependensi klien kredensial.

    <!-- https://mvnrepository.com/artifact/com.aliyun/alibabacloud-secretsmanager-client -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>alibabacloud-secretsmanager-client</artifactId>
        <version>1.3.7</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-core</artifactId>
        <version>4.7.0</version>
    </dependency>
  2. Buat file konfigurasi secretsmanager.properties.

    # Jenis kredensial akses, tetap sebagai client_key
    credentials_type=client_key
    
    # Kata sandi dekripsi untuk membaca Client Key: mendukung pembacaan dari variabel lingkungan atau file, hanya satu yang perlu disetel
    client_key_password_from_env_variable=<nama variabel lingkungan kata sandi kunci privat Client Key Anda>
    client_key_password_from_file_path=<path file kata sandi kunci privat Client Key Anda>
    
    # Path ke file kunci privat Client Key
    client_key_private_key_path=<path file kunci privat Client Key Anda>
    
    # Wilayah layanan KMS terkait
    cache_client_region_id=[{"regionId":"<regionId>"}]
  3. Gunakan file konfigurasi untuk menyampaikan informasi kredensial.

    import com.aliyun.oss.ClientBuilderConfiguration;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    import com.aliyun.oss.common.comm.SignVersion;
    import com.aliyuncs.kms.secretsmanager.client.SecretCacheClient;
    import com.aliyuncs.kms.secretsmanager.client.SecretCacheClientBuilder;
    import com.aliyuncs.kms.secretsmanager.client.exception.CacheSecretException;
    import com.aliyuncs.kms.secretsmanager.client.model.SecretInfo;
    import org.codehaus.jettison.json.JSONException;
    import org.codehaus.jettison.json.JSONObject;
    
    public class ClientKeyDemoTest {
        public static void main(String[] args) throws CacheSecretException {
            final SecretCacheClient client = SecretCacheClientBuilder.newClient();
            CredentialsProvider credentialsProvider = new CredentialsProvider() {
                @Override
                public void setCredentials(Credentials credentials) {
                }
    
                @Override
                public Credentials getCredentials() {
                    try {
                        SecretInfo secretInfo = client.getSecretInfo("<secretName>");
                        JSONObject jsonObject = new JSONObject(secretInfo.getSecretValue());
    
                        String accessKeyId = jsonObject.getString("AccessKeyId");
                        String accessKeySecret = jsonObject.getString("AccessKeySecret");
    
                        return new DefaultCredentials(accessKeyId, accessKeySecret);
                    } catch (CacheSecretException | JSONException e) {
                        return null;
                    }
                }
            };
            // Gunakan credentialsProvider untuk menginisialisasi klien.
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // Nyatakan secara eksplisit penggunaan algoritma tanda tangan V4.
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // Buat instance OSSClient.
            // Saat instance OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya.
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
        }
    }
    

Gunakan kredensial akses kustom

Jika tidak ada metode konfigurasi kredensial sebelumnya yang memenuhi kebutuhan Anda, sesuaikan penyedia kredensial dengan mengimplementasikan antarmuka CredentialProviders. Perhatikan bahwa jika implementasi dasarnya didasarkan pada token STS, Anda perlu menyediakan dukungan untuk pembaruan kredensial.

import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.Credentials;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentials;
import com.aliyun.oss.common.comm.SignVersion;

public class CustomCredentialProviderDemoTest {

    public static void main(String[] args) {

        CredentialsProvider credentialsProvider = new CredentialsProvider(){

            // Inisialisasi variabel
            String accessKeyId = null;
            // Inisialisasi variabel
            String accessKeySecrect = null;
            // Inisialisasi variabel
            // String token = null;

            @Override
            public void setCredentials(Credentials credentials) {
            }

            @Override
            public Credentials getCredentials() {
                //TODO
                //Sesuaikan metode untuk mendapatkan kredensial akses.

                // Mengembalikan kredensial jangka panjang: access_key_id, access_key_secrect  
                return new DefaultCredentials(accessKeyId, accessKeySecrect);

                // Mengembalikan kredensial sementara: access_key_id, access_key_secrect, token
                // Untuk kredensial sementara, Anda perlu memperbaruinya berdasarkan waktu kedaluwarsa.
                // return new DefaultCredentials(accessKeyId, accessKeySecrect, token);
            }
        };
        // Gunakan credentialsProvider untuk menginisialisasi klien.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // Secara eksplisit nyatakan penggunaan algoritma tanda tangan V4.
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
        // Buat instance OSSClient.
        // Saat instance OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya.
        OSS ossClient = OSSClientBuilder.create()
                .endpoint("endpoint")
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region("region")
                .build();

        ossClient.shutdown();
    }
}

Gunakan rantai kredensial default

Ketika Anda menginisialisasi klien kredensial tanpa melewati parameter apa pun, alat Kredensial menggunakan rantai kredensial default untuk menginisialisasi klien. Untuk informasi tentang logika membaca kredensial default, lihat Rantai Kredensial Default.

  1. Tambahkan dependensi kredensial.

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>TERBARU</version>
    </dependency>
  2. Konfigurasikan Credentials sebagai kredensial akses.

    import com.aliyun.credentials.models.CredentialModel;
    import com.aliyun.oss.*;
    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    import com.aliyun.oss.common.comm.SignVersion;
    
    public class Demo {
        public static void main(String[] args) {
            com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client();
            CredentialsProvider credentialsProvider = new CredentialsProvider(){
                @Override
                public void setCredentials(Credentials credentials) {
                }
    
                @Override
                public Credentials getCredentials() {
                    CredentialModel credential = credentialsClient.getCredential();
                    return  new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken());
                }
            };
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // Secara eksplisit nyatakan penggunaan algoritma tanda tangan V4.
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // Gunakan credentialsProvider untuk menginisialisasi klien.
            // Buat instans OSSClient.
            // Ketika instans OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya.
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("Titik akhir")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("Wilayah")
                    .build();
            ossClient.shutdown();
        }
    }

FAQ

Konflik paket

  • Penyebab

    Saat Anda menggunakan OSS SDK for Java 1.0, kesalahan serupa berikut menunjukkan adanya konflik paket di proyek Anda.

    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/ssl/TrustStrategy
        at com.aliyun.oss.OSSClient.<init>(OSSClient.java:268)
        at com.aliyun.oss.OSSClient.<init>(OSSClient.java:193)
        at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:77)
    Caused by: java.lang.ClassNotFoundException: org.apache.http.ssl.TrustStrategy
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        ... 3 more
                        

    atau

    Exception in thread "main" java.lang.NoSuchFieldError: INSTANCE
     at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52)
     at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:56)
     at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<clinit>(DefaultHttpRequestWriterFactory.java:46)
     at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:82)
     at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:95)
     at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:104)
     at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<clinit>(ManagedHttpClientConnectionFactory.java:62)
     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.<init>(PoolingHttpClientConnectionManager.java:572)
     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:174)
     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:158)
     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:149)
     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:125)
     at com.aliyun.oss.common.comm.DefaultServiceClient.createHttpClientConnectionManager(DefaultServiceClient.java:237)
     at com.aliyun.oss.common.comm.DefaultServiceClient.<init>(DefaultServiceClient.java:78)
     at com.aliyun.oss.OSSClient.<init>(OSSClient.java:268)
     at com.aliyun.oss.OSSClient.<init>(OSSClient.java:193)
     at OSSManagerImpl.upload(OSSManagerImpl.java:42)
     at OSSManagerImpl.main(OSSManagerImpl.java:63)
                        

    Kesalahan terjadi karena OSS SDK for Java 1.0 menggunakan Apache HttpClient 4.4.1, tetapi proyek Anda menggunakan versi yang bertentangan dari Apache HttpClient atau paket JAR commons-httpclient. Jalankan perintah mvn dependency:tree di direktori proyek Anda untuk melihat paket JAR dan versinya yang digunakan oleh proyek Anda. Seperti yang ditunjukkan pada gambar berikut, proyek menggunakan Apache HttpClient 4.3, yang bertentangan dengan versi standar:

  • Solusi

    Selesaikan konflik paket dengan salah satu dari dua cara berikut:

    • Gunakan versi yang seragam: Jika proyek Anda menggunakan versi yang bertentangan dengan Apache HttpClient 4.4.1, gunakan versi 4.4.1 dan hapus dependensi pada versi lain dari Apache HttpClient dari file pom.xml. Jika proyek Anda menggunakan commons-httpclient, konflik mungkin juga ada. Hapus dependensi commons-httpclient.

    • Selesaikan Konflik Dependensi: Jika proyek Anda bergantung pada beberapa pustaka pihak ketiga, dan pustaka tersebut juga bergantung pada versi berbeda dari Apache HttpClient, proyek Anda akan memiliki konflik dependensi. Gunakan tag exclusion untuk menyelesaikannya. Untuk informasi lebih lanjut, lihat Panduan Maven.

    OSS SDK for Java 1.0 bergantung pada versi paket berikut. Metode penyelesaian konfliknya mirip dengan HttpClient.

Paket hilang

  • Penyebab

    Saat Anda menggunakan OSS SDK for Java 1.0, kesalahan serupa berikut dapat terjadi karena proyek Anda mungkin kehilangan paket yang diperlukan untuk mengompilasi atau menjalankan OSS SDK for Java 1.0.

    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/auth/Credentials
            at com.aliyun.oss.OSSClient.<init>(OSSClient.java:268)
            at com.aliyun.oss.OSSClient.<init>(OSSClient.java:193)
            at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:76)
    Caused by: java.lang.ClassNotFoundException: org.apache.http.auth.Credentials
            at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
            at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
            ... 3 more
                        

    atau

    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/protocol/HttpContext
            at com.aliyun.oss.OSSClient.<init>(OSSClient.java:268)
            at com.aliyun.oss.OSSClient.<init>(OSSClient.java:193)
            at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:76)
    Caused by: java.lang.ClassNotFoundException: org.apache.http.protocol.HttpContext
            at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
            at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
            ... 3 more
                        

    atau

    Exception in thread "main" java.lang.NoClassDefFoundError: org/jdom/input/SAXBuilder
            at com.aliyun.oss.internal.ResponseParsers.getXmlRootElement(ResponseParsers.java:645)
            at … … 
            at com.aliyun.oss.OSSClient.doesBucketExist(OSSClient.java:471)
            at com.aliyun.oss.OSSClient.doesBucketExist(OSSClient.java:465)
            at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:82)
    Caused by: java.lang.ClassNotFoundException: org.jdom.input.SAXBuilder
            at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
            at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
            ... 11 more
                        

    OSS SDK for Java 1.0 bergantung pada paket-paket berikut:

    • aliyun-sdk-oss-2.2.1.jar

    • hamcrest-core-1.1.jar

    • jdom-1.1.jar

    • commons-codec-1.9.jar

    • httpclient-4.4.1.jar

    • commons-logging-1.2.jar

    • httpcore-4.4.1.jar

    • log4j-1.2.15.jar

    Di antaranya, log4j-1.2.15.jar adalah dependensi opsional. Tambahkan paket ini hanya jika Anda memerlukan fungsionalitas logging. Paket lainnya wajib.

  • Solusi

    Tambahkan paket yang menjadi dependensi OSS SDK for Java 1.0 ke proyek Anda. Anda dapat menggunakan salah satu metode berikut:

    • Proyek Eclipse: Untuk informasi lebih lanjut, lihat Instal SDK.

    • Proyek Ant: Tempatkan paket yang menjadi dependensi OSS SDK for Java 1.0 ke dalam direktori lib proyek Anda.

    • Kompilasi langsung: Gunakan perintah -classpath atau -cp untuk menentukan jalur paket yang menjadi dependensi OSS SDK for Java 1.0, atau tempatkan paket-paket ini di classpath.

Timeout koneksi

  • Penyebab

    Saat Anda menjalankan program OSS SDK for Java 1.0, kesalahan serupa berikut mungkin dilaporkan:

    com.aliyun.oss.ClientException: SocketException
        at com.aliyun.oss.common.utils.ExceptionFactory.createNetworkException(ExceptionFactory.java:71)
        at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:116)
        at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:121)
        at com.aliyun.oss.common.comm.ServiceClient.sendRequest(ServiceClient.java:67)
        at com.aliyun.oss.internal.OSSOperation.send(OSSOperation.java:92)
        at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:140)
        at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:111)
        at com.aliyun.oss.internal.OSSBucketOperation.getBucketInfo(OSSBucketOperation.java:1152)
        at com.aliyun.oss.OSSClient.getBucketInfo(OSSClient.java:1220)
        at com.aliyun.oss.OSSClient.getBucketInfo(OSSClient.java:1214)
        at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:94)
    Caused by: org.apache.http.conn.HttpHostConnectException: Connect to oss-test.oss-cn-hangzhou-internal.aliyuncs.com:80 [oss-test.oss-cn-hangzhou-internal.aliyuncs.com/10.84.135.99] failed: Connection timed out: connect
        at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:151)
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353)
        at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380)
        at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
        at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
        at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
        at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
        at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:113)
        ... 9 more
                        
  • Solusi

    Anda dapat menggunakan alat ossutil untuk dengan cepat menemukan penyebab kesalahan dan menyelesaikan masalah.

Kesalahan SignatureDoesNotMatch

  • Penyebab 1: Informasi Pasangan AccessKey tidak cocok

    AccessKey ID dan AccessKey secret tidak cocok. Untuk informasi tentang cara mendapatkan AccessKey ID dan AccessKey secret, lihat Buat Pasangan AccessKey.

  • Penyebab 2: Penggunaan URL yang Ditandatangani tidak benar

    Berikut ini adalah contoh salah dalam menggunakan URL yang ditandatangani:

    GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, object);
    request.setExpiration( new Date(new Date().getTime() + 3600 * 1000));
    request.addUserMetadata("author");
    URL url = ossClient.generatePresignedUrl(request);
    
    Map<String, String> header = new HashMap<String, String>();
    header.put("author");
    ossClient.putObject(url, new ByteArrayInputStream("Hello OSS".getBytes()), -1, header);

    Jika parameter Method tidak disetel, metode GET digunakan secara default. Namun, contoh sebelumnya adalah permintaan PutObject. Oleh karena itu, parameter Method harus disetel dan diatur ke PUT.

    Saat Anda mengirim permintaan PutObject,metadata kustom dalam header permintaan harus diawali dengan x-oss-meta-. Dalam contoh sebelumnya, metadata kustom harus diubah menjadi x-oss-meta-author.

    Solusi:

    Tentukan parameter Method dan modifikasi awalan header:

    request.addUserMetadata("author");
    request.setMethod(HttpMethod.PUT);
    URL url = ossClient.generatePresignedUrl(request);
    
    Map<String, String> header = new HashMap<String, String>();
    header.put("x-oss-meta-" + "author");
    ossClient.putObject(url, new ByteArrayInputStream("Hello OSS".getBytes()), -1, header);
  • Penyebab 3: Masalah kompatibilitas versi HttpClient

    • Versi OSS SDK sebelum 3.7.0 digunakan, dan HttpClient 4.5.9 atau lebih baru diperkenalkan dalam proyek.

    • Nama file yang diunggah berisi karakter +, dan HttpClient 4.5.9 tidak melakukan URL-encoding pada karakter +. Ini menyebabkan tanda tangan yang dihitung oleh klien dan server tidak konsisten.

    1

    Solusi:

    • Tingkatkan OSS SDK ke versi 3.11.1 atau lebih baru agar kompatibel dengan HttpClient 4.5.9.

    • Hapus dependensi HttpClient yang berlebihan. Saat Anda memperkenalkan OSS SDK, dependensi HttpClient secara otomatis diperkenalkan. Jika pustaka pihak ketiga juga memperkenalkan HttpClient, lihat solusi untuk Konflik Paket.

  • Penyebab 4: Masalah kompatibilitas set karakter HttpClient

    HttpClient 4.5.10 tidak mendukung karakter di luar standar ISO-8859-1 di header. Namun, versi HttpClient lebih baru dari 4.5.10 diperkenalkan dalam proyek, dan header permintaan berisi karakter di luar standar ISO-8859-1, seperti karakter Cina dalam metadata kustom yang dimulai dengan x-oss-meta-.3

    Solusi:

    • Lihat solusi untuk Konflik Paket untuk menghapus versi HttpClient yang bertentangan.

    • Lewatkan hanya karakter yang sesuai dengan standar ISO-8859-1 di header permintaan.

"Gagal mengurai hasil tanggapan" pengecualian

FAQ3

  • Penyebab

    Perangkat lunak khusus tertentu di sisi Klien memotong Permintaan HTTP, atau entri rute jaringan publik membajak Permintaan HTTP.

    Anda menggunakan OSS SDK for Java 1.0 pada Java 9 atau yang lebih baru, dan Anda belum menambahkan dependensi terkait JAXB ke file pom.xml.

  • Solusi

    Beralihlah ke Permintaan HTTPS.

    Tambahkan dependensi terkait JAXB. Untuk prosedurnya, lihat Instal SDK.

org.apache.http.NoHttpResponseException: Server target gagal merespons

  • Penyebab

    Saat Anda menjalankan program OSS SDK for Java 1.0, kesalahan serupa berikut dilaporkan:

    Menggunakan koneksi yang kedaluwarsa menyebabkan kesalahan di atas. Kesalahan ini hanya terjadi pada versi Java SDK sebelum 2.1.2.

  • Solusi

    Tingkatkan OSS SDK for Java 1.0 ke versi 2.1.2 atau lebih baru.

Banyak instance org.apache.http.impl.conn.PoolingHttpClientConnectionManager ada di JVM

  • Penyebab

    ossClient tidak ditutup dengan benar.

  • Solusi

    Tutup ossClient setelah selesai dieksekusi, atau gunakan pola singleton.

Panggilan OSS SDK for Java 1.0 tidak responsif

  • Penyebab

    Panggilan OSS SDK for Java 1.0 tidak responsif. Dengan menjalankan perintah jstack -l pid untuk melihat stack, masalah terletak pada posisi berikut:

    "main" prio=6 tid=0x000000000291e000 nid=0xc40 waiting on condition [0x0000000002dae000]
    java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000007d85697f8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
        at org.apache.http.pool.PoolEntryFuture.await(PoolEntryFuture.java:138)
        at org.apache.http.pool.AbstractConnPool.getPoolEntryBlocking(AbstractConnPool.java:306)
        at org.apache.http.pool.AbstractConnPool.access$000(AbstractConnPool.java:64)
        at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:192)
        at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:185)
        at org.apache.http.pool.PoolEntryFuture.get(PoolEntryFuture.java:107)
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.leaseConnection(PoolingHttpClientConnectionManager.java:276)
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$1.get(PoolingHttpClientConnectionManager.java:263)
        at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:190)
        at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
        at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
        at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
        at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:113)
        at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:123)
        at com.aliyun.oss.common.comm.ServiceClient.sendRequest(ServiceClient.java:68)
        at com.aliyun.oss.internal.OSSOperation.send(OSSOperation.java:94)
        at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:146)
        at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:113)
        at com.aliyun.oss.internal.OSSObjectOperation.getObject(OSSObjectOperation.java:229)
        at com.aliyun.oss.OSSClient.getObject(OSSClient.java:629)
        at com.aliyun.oss.OSSClient.getObject(OSSClient.java:617)
        at samples.HelloOSS.main(HelloOSS.java:49)
                        

    Penyebabnya adalah kebocoran koneksi di kolam koneksi, kemungkinan karena ossObject tidak ditutup dengan benar setelah digunakan.

  • Solusi

    Periksa program Anda untuk memastikan tidak ada kebocoran koneksi. Gunakan metode berikut untuk menutup koneksi dengan benar:

    // Baca file.
    OSSObject ossObject = ossClient.getObject(bucketName, objectName);
    // Operasi OSS
    // Tutup ossObject.
    ossObject.close();                

    Untuk langkah-langkah pemecahan masalah yang lebih rinci, lihat Pemecahan Masalah OSS SDK for Java 1.0 yang Tidak Responsif.

Koneksi ditutup

  • Penyebab

    Jika Anda mengalami kesalahan serupa berikut saat menggunakan ossClient.getObject:

    Exception in thread "main" org.apache.http.ConnectionClosedException: Premature end of Content-Length delimited message body (expected: 11990526; received: 202880)
        at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:180)
        at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:200)
        at org.apache.http.impl.io.ContentLengthInputStream.close(ContentLengthInputStream.java:103)
        at org.apache.http.impl.execchain.ResponseEntityProxy.streamClosed(ResponseEntityProxy.java:128)
        at org.apache.http.conn.EofSensorInputStream.checkClose(EofSensorInputStream.java:228)
        at org.apache.http.conn.EofSensorInputStream.close(EofSensorInputStream.java:174)
        at java.io.FilterInputStream.close(FilterInputStream.java:181)
        at java.io.FilterInputStream.close(FilterInputStream.java:181)
        at com.aliyun.oss.event.ProgressInputStream.close(ProgressInputStream.java:147)
        at java.io.FilterInputStream.close(FilterInputStream.java:181)
        at samples.HelloOSS.main(HelloOSS.java:39)
                        

    Penyebabnya adalah interval antara dua pembacaan data melebihi 1 menit. OSS menutup koneksi yang idle selama lebih dari 1 menit.

  • Solusi

    Jika Anda hanya membaca sebagian data setiap kali dan waktu pemrosesan data tidak tetap, gunakan unduhan rentang untuk menghindari penutupan koneksi selama pembacaan data. Koneksi ditutup secara otomatis setelah unduhan rentang selesai. Untuk informasi lebih lanjut, lihat Unduhan Rentang (Java SDK).

Kebocoran memori

  • Penyebab

    Program yang memanggil OSS SDK for Java 1.0 mengalami kebocoran memori setelah berjalan selama beberapa waktu (dari beberapa jam hingga beberapa hari, tergantung volume bisnis). Kami merekomendasikan menggunakan Eclipse Memory Analyzer (MAT) untuk menganalisis penggunaan memori. Untuk informasi lebih lanjut, lihat Analisis File Dump Heap dengan MAT.

    Jika hasil analisisnya mirip dengan gambar di bawah ini (PoolingHttpClientConnectionManager menempati 96% dari memori), penyebabnya adalah bahwa new OSSClient mungkin telah dieksekusi beberapa kali dalam program, tetapi ossClient.shutdown tidak dipanggil, yang mengakibatkan kebocoran memori.

  • Solusi

    Setelah operasi new OSSClient selesai, panggil metode shutdown untuk menutupnya. Pastikan new OSSClient dan ossClient.shutdown digunakan berpasangan.

InterruptedException dilaporkan saat memanggil ossClient.shutdown

  • Penyebab

    Versi OSS SDK for Java 1.0 sebelum 2.3.0 melaporkan pengecualian berikut saat memanggil ossClient.shutdown:

    java.lang.InterruptedException: sleep interrupted
            at java.lang.Thread.sleep(Native Method)
            at com.aliyun.oss.common.comm.IdleConnectionReaper.run(IdleConnectionReaper:76)      

    Penyebabnya adalah bahwa thread backend ossClient IdleConnectionReaper secara berkala menutup koneksi idle. Jika ossClient.shutdown dipanggil saat IdleConnectionReaper sedang Sleep, pengecualian di atas dilaporkan.

  • Solusi

    Gunakan kode berikut untuk mengabaikan pengecualian:

    try {
        ossClient.shutdown();
    } catch(Exception e) {
    }                  

"SDK.ServerUnreachable : Titik akhir atau uri yang ditentukan tidak valid" pengecualian

  • Penyebab

    • Klien mengirim terlalu banyak permintaan konkurensi ke STS.

    • Koneksi jaringan ke server mengalami waktu habis.

    • Versi STS SDK dan SDK core yang digunakan bukan versi terbaru.

  • Solusi

    • Klien mengirim terlalu banyak permintaan konkurensi ke STS, dan ECS instance klien atau komputer lokal tidak dapat menangani konkurensi. Kurangi konkurensi OSS.

    • Koneksi jaringan dari pengguna ke server mengalami waktu habis. Tangkap paket untuk memverifikasi hal ini.

    • Perbarui STS SDK dan SDK core ke versi terbaru.

NoSuchKey

  • Penyebab

    File sumber tidak ada.

  • Solusi

    Untuk informasi lebih lanjut, lihat 404 Error.

SocketException

  • Penyebab

    Socket mungkin gagal selama fase inisialisasi, menyebabkan permintaan gagal sebelum mencapai OSS.

  • Solusi

    Kami menyarankan Anda memeriksa aspek-aspek berikut:

    • Apakah fluktuasi jaringan terjadi saat masalah muncul.

    • Apakah jumlah koneksi soket pada Host telah mencapai batas maksimal?

    • Pastikan apakah jumlah koneksi melebihi pengaturan maxconnection di SDK saat masalah terjadi. Jika jumlah koneksi melebihi pengaturan maxconnection, pengecualian socket juga akan terjadi.

    Jika tidak ada masalah dengan hal-hal di atas, kami sarankan Anda menggunakan tcpdump atau Wireshark untuk menangkap paket, lalu menganalisis paket data setelah masalah berulang.

Pemicu callback OSS PostObject tidak dipicu

Pemicu callback OSS PostObject tidak dipicu, tetapi pemicu callback yang sama bekerja pada PutObject. Secara umum, jika format JSON tidak benar atau callback gagal, pesan yang sesuai akan dikembalikan. Dalam kasus ini, Anda perlu menguji efek callback Put dan Post secara terpisah:

  • Penyebab

    Saat mengirim permintaan, parameter callback berada di bawah parameter file.image

  • Solusi

    Atur ulang posisi parameter callback dan file.

    Pada titik ini, hasil pengujian menunjukkan bahwa server bisnis berhasil menangkap permintaan.

Connection pool shut down

Caused by: java.lang.IllegalStateException: Connection pool shut down
  at org.apache.http.util.Asserts.check(Asserts.java:34)
  at org.apache.http.pool.AbstractConnPool.lease(AbstractConnPool.java:184)
  at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.requestConnection(PoolingHttpClientConnectionManager.java:251)
  at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:175)
  at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
  at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
  at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
  at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
  at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:124)
  at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:133)
  ... 8 more
  • Penyebab

    Anda terus mengirim permintaan melalui ossClient setelah memanggil metode ossClient.shutdown().

  • Solusi

    Periksa logika pemanggilan Anda untuk memastikan bahwa setelah Anda memanggil metode ossClient.shutdown(), Anda tidak lagi mengirim permintaan melalui ossClient.

Kesalahan "Request has expired" terjadi untuk permintaan yang dihasilkan oleh generatePresignedUrl dari Java SDK

  • Penyebab

    Overflow integer menyebabkan masalah timestamp terkait dengan masalah tahun 2038.

    Permintaan unggah dimulai setelah waktu kedaluwarsa yang ditetapkan untuk URL.

  • Solusi

    Jika itu adalah overflow integer, kami menyarankan agar durasi kedaluwarsa di Java SDK tidak melebihi tahun 2038.

    Jika permintaan unggah dimulai setelah waktu kedaluwarsa yang ditetapkan untuk URL, atur waktu kedaluwarsa yang wajar untuk memastikan bahwa waktu kedaluwarsa lebih lambat dari waktu Anda memulai permintaan.

"Invalid Response" atau "Implementasi JAXB-API tidak ditemukan di module path atau classpath" kesalahan

  • Penyebab

    Anda menggunakan Java 9 atau yang lebih baru dan belum menambahkan dependensi JAXB.

  • Solusi

    Untuk informasi tentang cara menambahkan dependensi JAXB, lihat Instal SDK.

Apakah OSSClient dalam OSS SDK for Java 1.0 thread-safe?

  1. Ya, itu thread-safe. OSSClient bersifat thread-safe, yang memungkinkan beberapa thread mengakses instance yang sama. Anda dapat menggunakan kembali instance OSSClient yang sama atau membuat beberapa instance OSSClient untuk digunakan secara terpisah, berdasarkan kebutuhan bisnis Anda.

  2. Instance OSSClient mempertahankan kolam koneksi secara internal. Saat instance OSSClient tidak lagi diperlukan, Anda harus memanggil metode shutdown untuk menutupnya dan menghindari kehabisan sumber daya karena terlalu banyak instance OSSClient yang dibuat.

Kesalahan "AccessDenied Hierarchical namespace is disabled" dilaporkan

  • Penyebab

    Hierarchical namespace tidak diaktifkan sebelum Anda memanggil operasi API CreateDirectory, Rename, atau DeleteDirectory.

  • Solusi

    Aktifkan hierarchical namespace saat Anda membuat bucket. Untuk prosedur spesifik, lihat Buat Bucket.

Jaringan klien normal, tetapi kesalahan "Connection reset" dilaporkan selama akses HTTP. Bagaimana cara menanganinya?

Beberapa operator di wilayah tertentu mungkin membajak nama domain OSS. Kami merekomendasikan agar Anda mengonfigurasi protokol sebagai HTTPS melalui endpoint. Untuk informasi lebih lanjut, lihat Konfigurasikan Klien.

Java 17 Tidak dapat memanggil "java.lang.reflect.Method.invoke(Object, Object[])" karena "com.sun.xml.bind.v2.runtime.reflect.opt.Injector.defineClass" adalah null

  • Penyebab

    JAXB ditandai sebagai deprecated di Java 9 dan dihapus di Java 11.

  • Solusi

    Tambahkan dependensi berikut:

        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.messaging.saaj</groupId>
            <artifactId>saaj-impl</artifactId>
            <version>1.5.1</version>
        </dependency>

Bagaimana cara mengonfigurasi pencatatan log internal untuk Java SDK?

Java SDK menggunakan framework Apache Commons Logging (JCL) untuk pencatatan log. JCL dapat menggunakan beberapa framework implementasi logging. Untuk informasi lebih lanjut, lihat JCL-Konfigurasi. Yang paling umum adalah JCL over log4j atau JCL over SLF4j. Metode implementasinya adalah sebagai berikut:

  • JCL over log4j: Anda perlu memperkenalkan dependensi log4j (log4j 2.x memiliki beberapa framework implementasi untuk dipilih, defaultnya adalah log4j-api+log4j-core) dan mengonfigurasinya sesuai dengan metode konfigurasi log4j. Untuk proses spesifik, lihat APACHE LOG4J-API Separation.

  • JCL over slf4j: Anda perlu memperkenalkan dependensi jcl-over-slf4j dan slf4j (slf4j juga memiliki beberapa framework implementasi untuk dipilih, seperti slf4j-api+logback-classic) dan mengonfigurasinya sesuai dengan metode konfigurasi slf4j. Untuk proses spesifik, lihat SJF4J-Bridging Legacy APIs.

Apache Log4j mendefinisikan berbagai tingkat log, termasuk OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE, dan ALL.

Aktifkan atau nonaktifkan log SDK dengan mengonfigurasi properti log4j:

FAQ1