Integración rápida
Para integrar OSS Java SDK V1:
Preparar el entorno
Instale Java 7 o una versión posterior. Ejecute el comando java -version para consultar la versión de Java instalada. Si Java no está instalado o su versión es anterior a Java 7, descargue Java.
Instalar el SDK
Elija un método de instalación según su entorno. Utilice la versión más reciente de OSS Java SDK V1.
A continuación se muestran ejemplos con OSS Java SDK V1 3.17.4.
Agregar una dependencia de Maven (recomendado)
Para usar OSS Java SDK V1 en un proyecto de Maven, agregue la dependencia correspondiente al archivo pom.xml.
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.18.4</version>
</dependency>
Si usa Java 9 o una versión posterior, agregue las siguientes dependencias relacionadas con JAXB.
<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>
<!-- no more than 2.3.3-->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>
Importar paquetes JAR a un proyecto de Eclipse
Descargue OSS Java SDK V1.
Descomprima el paquete.
Copie el archivo aliyun-sdk-oss-3.17.4.jar y todos los archivos de la carpeta
libdel paquete descomprimido a su proyecto.En Eclipse, haga clic derecho en su proyecto y seleccione .
Seleccione todos los archivos JAR copiados e impórtelos en Libraries.
Importar paquetes JAR a un proyecto de IntelliJ IDEA
Descargue OSS Java SDK V1.
Descomprima el paquete.
Copie el archivo aliyun-sdk-oss-3.17.4.jar y todos los archivos JAR de la carpeta
libdel paquete descomprimido a su proyecto.En IntelliJ IDEA, seleccione su proyecto y elija .
Seleccione todos los archivos JAR copiados e impórtelos en External Libraries.
Configurar las credenciales de acceso
Configure las credenciales de acceso con el par de AccessKey de un usuario de RAM.
En la consola de RAM, cree un usuario de RAM con un Permanent AccessKey Pair. Guarde el par de AccessKey y otorgue el permiso
AliyunOSSFullAccessal usuario.-
Utilice el par de AccessKey del usuario de RAM para configurar las variables de entorno.
Linux
-
Ejecute los siguientes comandos en la interfaz de línea de comandos para agregar la configuración de las variables de entorno al archivo
~/.bashrc.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc -
Ejecute el siguiente comando para aplicar los cambios.
source ~/.bashrc -
Ejecute los siguientes comandos para comprobar que las variables de entorno están configuradas.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
macOS
-
Ejecute el siguiente comando en la terminal para consultar el tipo de shell predeterminado.
echo $SHELL -
Realice las siguientes operaciones según el tipo de shell predeterminado.
Zsh
-
Ejecute los siguientes comandos para agregar la configuración de las variables de entorno al archivo
~/.zshrc.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc -
Ejecute el siguiente comando para aplicar los cambios.
source ~/.zshrc -
Ejecute los siguientes comandos para comprobar que las variables de entorno están configuradas.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Bash
-
Ejecute los siguientes comandos para agregar la configuración de las variables de entorno al archivo
~/.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 -
Ejecute el siguiente comando para aplicar los cambios.
source ~/.bash_profile -
Ejecute los siguientes comandos para comprobar que las variables de entorno están configuradas.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
-
Windows
CMD
-
Ejecute los siguientes comandos en CMD.
setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID" setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET" -
Ejecute los siguientes comandos para comprobar que las variables de entorno están configuradas.
echo %OSS_ACCESS_KEY_ID% echo %OSS_ACCESS_KEY_SECRET%
PowerShell
-
Ejecute los siguientes comandos en 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) -
Ejecute los siguientes comandos para comprobar que las variables de entorno están configuradas.
[Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
-
Inicializar el cliente
El siguiente código de ejemplo utiliza el endpoint público de la región China (Hangzhou) para inicializar el cliente. Después, enumera todos los buckets propiedad de la cuenta para verificar la configuración. Para ver la lista completa de regiones y endpoints, consulte Regions and endpoints.
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;
/**
* OSS SDK quick integration example
* Shows how to initialize an OSS client and list all buckets
*/
public class Test {
public static void main(String[] args) {
// Obtain access credentials from environment variables
String accessKeyId = System.getenv("OSS_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("OSS_ACCESS_KEY_SECRET");
// Set the OSS region and endpoint
String region = "cn-hangzhou";
String endpoint = "oss-cn-hangzhou.aliyuncs.com";
// Create a credential provider
DefaultCredentialProvider provider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);
// Configure client parameters
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Explicitly declare the use of the V4 signature algorithm
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
// Initialize the OSS client
OSS ossClient = OSSClientBuilder.create()
.credentialsProvider(provider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.endpoint(endpoint)
.build();
// List all buckets of the current user
List<Bucket> buckets = ossClient.listBuckets();
System.out.println("Successfully connected to OSS. Buckets under the current account:");
if (buckets.isEmpty()) {
System.out.println("No buckets found under the current account.");
} else {
for (Bucket bucket : buckets) {
System.out.println("- " + bucket.getName());
}
}
// Release resources
ossClient.shutdown();
System.out.println("OSS client has been shut down.");
}
}
Al ejecutar el código, se muestran los buckets de la cuenta actual en todas las regiones:
Successfully connected to OSS. Buckets under the current account:
- example-bucket
OSS client has been shut down.
Configuración del cliente
Utilice la clase ClientConfiguration para configurar los parámetros de OSSClient, como los tiempos de espera, los reintentos y los servidores proxy.
Usar un nombre de dominio personalizado
El nombre de dominio predeterminado de OSS puede provocar denegaciones de acceso o errores de vista previa debido a las políticas de seguridad de OSS. Binding a custom domain name evita estas restricciones, permite vistas previas directas de archivos y admite la integración con CDN para acelerar el contenido a nivel global.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Enable the CNAME option to support access through a custom domain name
clientBuilderConfiguration.setSupportCname(true);
OSS ossClient = new OSSClientBuilder()
// Other configurations...
.clientConfiguration(clientBuilderConfiguration)
// Use your custom domain name as the endpoint, such as https://static.example.com
.endpoint("https://static.example.com")
.build();
Usar un endpoint interno
Cuando su aplicación se ejecuta en servicios de Alibaba Cloud como ECS o Container Service, utilice un endpoint interno para obtener transferencia de datos interna gratuita, mayor velocidad y mejor estabilidad. El acceso interno es adecuado para cargas de archivos grandes, procesamiento de datos por lotes y accesos de alta frecuencia. Regions and endpoints.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
OSS ossClient = new OSSClientBuilder()
// Other configurations...
.clientConfiguration(clientBuilderConfiguration)
// Use an internal endpoint. The China (Hangzhou) region is used as an example. For other regions, specify the actual endpoint.
.endpoint("oss-cn-hangzhou-internal.aliyuncs.com")
.build();
Control de tiempos de espera
Ajuste los parámetros de tiempo de espera según su caso de uso. Aumente los tiempos de espera para transferencias de archivos grandes o redes inestables. Utilice tiempos de espera más cortos en operaciones ligeras de alta concurrencia para liberar recursos rápidamente.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Set the maximum number of allowed open HTTP connections. The default is 1024.
clientBuilderConfiguration.setMaxConnections(1024)
// Set the timeout period for data transfers at the socket layer, in milliseconds. The default is 50000 ms.
.setSocketTimeout(50000)
// Set the timeout period for establishing a connection, in milliseconds. The default is 50000 ms.
.setConnectionTimeout(50000)
// Set the timeout period for obtaining a connection from the connection pool, in milliseconds. By default, there is no timeout limit.
.setConnectionRequestTimeout(60 * 60 * 24 * 1000)
// Set the idle timeout period for a connection, in milliseconds. If a connection is idle for longer than this period, it is closed. The default is 60000 ms.
.setIdleConnectionTime(60000);
OSS ossClient = new OSSClientBuilder()
// Other configurations...
.clientConfiguration(clientBuilderConfiguration)
.build();
Número máximo de reintentos por error
De forma predeterminada, el cliente de OSS reintenta tres veces las solicitudes que fallaron. En entornos de alta concurrencia o con redes inestables, utilice setMaxErrorRetry para aumentar los reintentos. Ajústelo según sus requisitos de latencia y la calidad de la red.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Set the maximum number of retries for a failed request. Adjust this based on your network environment and business needs.
clientBuilderConfiguration.setMaxErrorRetry(5);
OSS ossClient = new OSSClientBuilder()
// Other configurations...
.clientConfiguration(clientBuilderConfiguration)
.build();
Política de reintentos
No utilice setRetryStrategy para establecer una política de reintento personalizada, ya que podría causar comportamientos inesperados. El cliente de OSS aplica políticas de reintento probadas según el tipo de solicitud:
Solicitudes POST: no se reintentan de forma predeterminada para evitar inconsistencias de datos derivadas de envíos repetidos.
-
Solicitudes que no son POST: se reintentan hasta tres veces si se cumplen las siguientes condiciones.
Se produce una excepción
ClientExceptioncon uno de los siguientes códigos de error:ConnectionTimeout,SocketTimeout,ConnectionRefused,UnknownHostoSocketException.Se produce una excepción
OSSExceptioncon un código de error distinto deInvalidResponse.Se produce un error temporal del lado del servidor con un código de estado HTTP 500, 502 o 503.
Servidor proxy
Las redes corporativas suelen enrutar el tráfico a través de servidores proxy. Una vez configurado el proxy, el cliente de OSS reenvía todas las solicitudes HTTP por medio de este.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Set the user agent, which is the User-Agent header in HTTP. The default value is aliyun-sdk-java.
clientBuilderConfiguration.setUserAgent("aliyun-sdk-java");
// Set the IP address of the proxy server. Replace "" with the actual IP address of the proxy server, such as "196.128.xxx.xxx".
clientBuilderConfiguration.setProxyHost("");
// Set the port of the proxy server, such as 8080.
clientBuilderConfiguration.setProxyPort(8080);
// Set the username for proxy server authentication. Replace "" with the actual username, such as "admin".
clientBuilderConfiguration.setProxyUsername("");
// Set the password for proxy server authentication. Replace "" with the corresponding password.
clientBuilderConfiguration.setProxyPassword("");
OSS ossClient = new OSSClientBuilder()
// Other configurations...
.clientConfiguration(clientBuilderConfiguration)
.build();
Protocolo HTTP/HTTPS
Utilice setProtocol para establecer el protocolo de comunicación. El valor predeterminado es HTTP. En producción, utilice HTTPS para garantizar la transferencia segura de datos y prevenir ataques de intermediario.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Set the communication protocol to HTTPS to ensure secure data transfer.
clientBuilderConfiguration.setProtocol(Protocol.HTTPS);
OSS ossClient = new OSSClientBuilder()
// Other configurations...
.clientConfiguration(clientBuilderConfiguration)
.build();
Versión de firma
La firma V1 de Alibaba Cloud Object Storage Service se eliminará gradualmente según el siguiente calendario. Se recomienda que upgrade to Signature V4 lo antes posible para evitar afectaciones en sus servicios.
A partir del 1 de marzo de 2025, los nuevos usuarios no podrán utilizar Signature V1.
A partir del 1 de septiembre de 2025, Signature V1 dejará de recibir actualizaciones y mantenimiento, y los nuevos buckets no podrán utilizarla.
Puede utilizar setSignatureVersion para configurar la versión del algoritmo de firma. Cuando utilice Signature V4, debe especificar la region ID correcta mediante el parámetro region. El algoritmo de firma V4 ofrece mayor seguridad. OSS Java SDK V1 3.15.0 y versiones posteriores admiten Signature V4.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Set the signature algorithm version to V4 for higher security.
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = new OSSClientBuilder()
// Other configurations...
// You must specify the region ID when using Signature V4.
.region("cn-hangzhou")
.clientConfiguration(clientBuilderConfiguration)
.build();
Usar una dirección IP
Utilice una dirección IP como endpoint para acceder desde la red interna o en entornos de red especiales. Tras establecer una conexión mediante CEN, Express Connect, una línea dedicada o una VPN, el acceso directo por IP omite la resolución DNS y mejora la eficiencia. Para conocer las configuraciones de enrutamiento, consulte Internal endpoints and VIP CIDR blocks for OSS.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Enable access to OSS through a second-level domain. This feature is disabled by default.
// This value must be set for OSS Java SDK V1 2.1.2 and earlier.
// Versions 2.1.2 and later automatically detect the IP address, so this value is no longer required.
clientBuilderConfiguration.setSLDEnabled(true);
OSS ossClient = new OSSClientBuilder()
// Other configurations...
.clientConfiguration(clientBuilderConfiguration)
// When you access OSS using an IP address, use the HTTP protocol to avoid SSL certificate verification issues.
.endpoint("http://10.10.10.10")
.build();
Comprobación CRC
Las comprobaciones de datos CRC están habilitadas de forma predeterminada para garantizar la integridad de la transferencia. Mantenga CRC habilitado en producción. Considere deshabilitarlo únicamente en escenarios donde sea tolerable una pérdida mínima de datos, como transmisiones de vista previa en vivo, datos de dispositivos IoT, videos de vigilancia de baja calidad o transferencias por lotes en redes internas altamente confiables. Evalúe completamente los riesgos de consistencia de datos antes de deshabilitarlo.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Disable the CRC data check feature. Use this with caution and fully assess the risks.
clientBuilderConfiguration.setCrcCheckEnabled(false);
OSS ossClient = new OSSClientBuilder()
// Other configurations...
.clientConfiguration(clientBuilderConfiguration)
.build();
Patrón singleton
Utilice el patrón singleton para crear y gestionar instancias de OSSClient.
OSSClient es seguro para hilos. Aplique el patrón singleton para reutilizar una única instancia de OSSClient y evite la sobrecarga de crearla y destruirla constantemente.
OSSClient mantiene un pool de conexiones interno. Cuando ya no lo necesite, llame al método shutdown para liberar los recursos.
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() {}
// Implement singleton with a static inner class (thread-safe)
private static class SingletonHolder {
private static final OSS INSTANCE = create();
private static OSS create() {
try {
// The China (Hangzhou) region is used as an example. For other regions, specify the actual endpoint.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Enter the region where the bucket is located. The China (Hangzhou) region is used as an example. Set the region to cn-hangzhou.
String region = "cn-hangzhou";
ClientBuilderConfiguration config = new ClientBuilderConfiguration();
// Explicitly declare the use of the V4 signature algorithm.
config.setSignatureVersion(SignVersion.V4);
// Obtain access credentials from environment variables. Before running this sample code, make sure the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set.
CredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Build the OSS client.
return OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(config)
.region(region)
.build();
} catch (Exception e) {
throw new RuntimeException("Failed to initialize OSS client", e);
}
}
}
// Get the singleton instance.
public static OSS getInstance() {
return SingletonHolder.INSTANCE;
}
// Test the PutObject operation in the main function.
public static void main(String[] args) {
// Get the singleton OSS client.
OSS ossClient = OssClientSingleton.getInstance();
// Enter the bucket name, such as examplebucket.
String bucketName = "examplebucket";
// Enter the full path of the object, excluding the bucket name, such as testfolder/exampleobject.txt.
String objectKey = "testfolder/exampleobject.txt";
try {
// Enter the string.
String content = "Hello OSS";
// Create a PutObjectRequest object.
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectKey, new ByteArrayInputStream(content.getBytes()));
// To set the storage class and access permissions during upload, see the following sample code.
ObjectMetadata metadata = new ObjectMetadata();
metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
metadata.setObjectAcl(CannedAccessControlList.Private);
putObjectRequest.setMetadata(metadata);
// Upload the string.
PutObjectResult result = ossClient.putObject(putObjectRequest);
// Print the upload result.
System.out.println("File uploaded successfully!");
System.out.println("ETag: " + result.getETag());
System.out.println("Request ID: " + result.getRequestId());
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
// In singleton mode, do not close the client after each operation (to reuse the connection), as this may affect subsequent use.
// When the OSSClient instance is no longer needed (for example, before the application exits), call the shutdown method once to release resources.
// ossClient.shutdown();
}
}
}
Manejo de excepciones
OSS Java SDK V1 genera dos tipos de excepciones: ClientException y OSSException, ambas extensiones de RuntimeException.
Excepciones de cliente (ClientException)
Las excepciones de cliente ocurren durante la construcción de la solicitud, su envío o la transferencia de datos. Algunos escenarios comunes son los siguientes:
La conexión de red no está disponible, lo que impide enviar la solicitud al servidor.
Se produce una excepción de E/S durante la carga del archivo.
Ocurren excepciones de red subyacentes, como un tiempo de espera agotado en la solicitud o un error en la verificación del certificado.
Una ClientException indica que la solicitud no llegó al servidor de OSS o que ocurrió un error durante el procesamiento del lado del cliente. Compruebe la conexión de red y la configuración del cliente.
Excepciones de servidor (OSSException)
Las excepciones de servidor indican que la solicitud llegó a OSS, pero fue rechazada. OSSException proporciona lo siguiente:
Incluye códigos y mensajes de error detallados para identificar el problema con precisión.
Entre los errores comunes se encuentran SignatureDoesNotMatch, AccessDenied y NoSuchKey.
Gestionar estas excepciones según el código de error mejora significativamente la robustez del programa y la experiencia del usuario.
Capture estos dos tipos de excepciones por separado para identificar y manejar los errores con precisión.
// Create client operation...
try {
// Perform OSS operations, such as uploading a file, downloading a file, or listing objects.
// These operations may throw OSS-related exceptions.
ossClient.putObject(...);
} catch (OSSException oe) {
// Catch exceptions returned by the OSS server.
// This exception is thrown when a request successfully reaches the OSS server, but the server rejects the request.
// Common causes: insufficient permissions, incorrect parameters, resource does not exist, etc.
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
// Output detailed error information for problem location and debugging.
System.out.println("Error Message: " + oe.getErrorMessage());
System.out.println("Error Code: " + oe.getErrorCode());
System.out.println("Request ID: " + oe.getRequestId());
System.out.println("Host ID: " + oe.getHostId());
} catch (ClientException ce) {
// Catch client exceptions.
// This exception is thrown when the client encounters a serious internal problem while communicating with OSS.
// Common causes: network connection issues, SSL certificate issues, DNS resolution failure, etc.
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
// Output detailed information about the client exception.
System.out.println("Error Message: " + ce.getMessage());
} finally {
// Release client resources regardless of whether the operation succeeded or failed.
// This is a best practice to avoid resource leaks and connection pool exhaustion.
if (ossClient != null) {
ossClient.shutdown(); // Close the client to release network connections and other resources.
}
}
Código de ejemplo
El SDK de Java V1 para OSS proporciona código de ejemplo que abarca la gestión de buckets, las operaciones con archivos, el control de acceso y la transferencia cifrada:
Archivo de ejemplo | Contenido del ejemplo |
Nota La implementación de PostObject no depende del SDK de Java. | |
Prevent overwriting a file with the same name (OSS Java SDK V1) | |
Configuración de credenciales de acceso
OSS admite varios métodos para inicializar credenciales. Elija uno según sus necesidades de autenticación.
Uso del par de AccessKey de un usuario de RAM
Este método es adecuado para aplicaciones en entornos seguros que requieren acceso prolongado a OSS sin rotar las credenciales con frecuencia. Inicialice el proveedor de credenciales con el par de AccessKey (AccessKey ID y AccessKey secret) de un usuario de RAM. Dado que exige mantener manualmente el par de AccessKey, aumenta los riesgos de seguridad.
Una cuenta de Alibaba Cloud tiene permisos completos sobre sus recursos. Si el par de AccessKey se filtra, representa un riesgo significativo para su sistema. No se recomienda usar el par de AccessKey de una cuenta de Alibaba Cloud. En su lugar, utilice el par de AccessKey de un usuario de RAM con los permisos mínimos obligatorios.
Para crear un par de AccessKey para un usuario de RAM, consulte Create an AccessKey pair. El AccessKey ID y el AccessKey secret de un usuario de RAM solo se muestran cuando se crea el par de AccessKey. Si los olvida, debe crear un nuevo par de AccessKey para reemplazar el anterior.
Variables de entorno
-
Configure las variables de entorno con el par de AccessKey de un usuario de RAM.
Linux
-
Ejecute los siguientes comandos en la interfaz de línea de comandos para agregar la configuración de las variables de entorno al archivo
~/.bashrc.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc -
Ejecute el siguiente comando para aplicar los cambios.
source ~/.bashrc -
Ejecute los siguientes comandos para comprobar que las variables de entorno se configuraron correctamente.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
macOS
-
Ejecute el siguiente comando en la terminal para consultar el tipo de shell predeterminado.
echo $SHELL -
Realice las siguientes operaciones según el tipo de shell predeterminado.
Zsh
-
Ejecute los siguientes comandos para agregar la configuración de las variables de entorno al archivo
~/.zshrc.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc -
Ejecute el siguiente comando para aplicar los cambios.
source ~/.zshrc -
Ejecute los siguientes comandos para comprobar que las variables de entorno se configuraron correctamente.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Bash
-
Ejecute los siguientes comandos para agregar la configuración de las variables de entorno al archivo
~/.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 -
Ejecute el siguiente comando para aplicar los cambios.
source ~/.bash_profile -
Ejecute los siguientes comandos para comprobar que las variables de entorno se configuraron correctamente.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
-
Windows
CMD
-
Ejecute los siguientes comandos en CMD.
setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID" setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET" -
Ejecute los siguientes comandos para comprobar que las variables de entorno se configuraron correctamente.
echo %OSS_ACCESS_KEY_ID% echo %OSS_ACCESS_KEY_SECRET%
PowerShell
-
Ejecute los siguientes comandos en 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) -
Ejecute los siguientes comandos para comprobar que las variables de entorno se configuraron correctamente.
[Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
-
Después de modificar las variables de entorno del sistema, reinicie o actualice su entorno de desarrollo. Esto incluye su IDE, la interfaz de línea de comandos, otras aplicaciones de escritorio y los servicios de backend, para asegurar que las variables de entorno más recientes se carguen correctamente.
-
Utilice las variables de entorno para pasar la información de las credenciales.
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 { // Obtain credentials from environment variables. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Use credentialsProvider for subsequent operations... ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // Create an OSSClient instance. // When the OSSClient instance is no longer needed, call the shutdown method to release resources. OSS ossClient = OSSClientBuilder.create() .endpoint("endpoint") .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region("region") .build(); ossClient.shutdown(); } }
Credenciales estáticas
A continuación se muestra cómo codificar de forma fija las credenciales de acceso y establecer explícitamente el par de AccessKey que se va a utilizar.
No inserte credenciales de acceso directamente en las aplicaciones de un entorno de producción. Este método es únicamente para fines de prueba.
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 {
// Enter the AccessKey ID and AccessKey secret of the RAM user.
String accessKeyId = "yourAccessKeyID";
String accessKeySecret = "yourAccessKeySecret";
// Use the DefaultCredentialProvider method to directly set the AccessKey ID and AccessKey secret.
CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);
// Use credentialsProvider to initialize the client.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Explicitly declare the use of the V4 signature algorithm.
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
// Create an OSSClient instance.
// When the OSSClient instance is no longer needed, call the shutdown method to release resources.
OSS ossClient = OSSClientBuilder.create()
.endpoint("endpoint")
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region("region")
.build();
ossClient.shutdown();
}
}
Uso de un token de STS
Este método es adecuado para aplicaciones que requieren acceso temporal a OSS. Inicialice el proveedor de credenciales con las credenciales temporales (AccessKey ID, AccessKey secret y security token) obtenidas de STS. Debe actualizar manualmente el token de STS para realizar accesos repetidos.
Para obtener rápidamente un token de STS mediante una openapi, consulte AssumeRole - Obtain temporary identity credentials for a RAM role.
Para obtener un token de STS mediante un SDK, consulte Use an STS token to access OSS.
Debe especificar un tiempo de expiración cuando genere un token de STS. El token deja de ser válido y no se puede utilizar después de su expiración.
Para consultar la lista de endpoints del servicio STS, consulte Service endpoints.
Variables de entorno
-
Utilice las credenciales de identidad temporales para establecer las variables de entorno.
Mac OS/Linux/Unix
ImportanteTenga en cuenta que aquí se utilizan las credenciales de identidad temporales (AccessKey ID, AccessKey secret y security token) obtenidas del servicio STS, no el par de AccessKey de un usuario de RAM.
Tenga en cuenta que el AccessKey ID obtenido del servicio STS comienza con "STS", por ejemplo, "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
ImportanteTenga en cuenta que aquí se utilizan las credenciales de identidad temporales (AccessKey ID, AccessKey secret y security token) obtenidas del servicio STS, no el par de AccessKey (AccessKey ID y AccessKey secret) de un usuario de RAM.
Tenga en cuenta que el AccessKey ID obtenido del servicio STS comienza con "STS", por ejemplo, "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> -
Pase la información de las credenciales mediante variables de entorno.
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 { // Obtain credentials from environment variables. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Use credentialsProvider to initialize the client. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); // Explicitly declare the use of the V4 signature algorithm. clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // Create an OSSClient instance. // When the OSSClient instance is no longer needed, call the shutdown method to release resources. OSS ossClient = OSSClientBuilder.create() .endpoint("endpoint") .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region("region") .build(); ossClient.shutdown(); } }
Credenciales estáticas
Puede codificar de forma fija las credenciales en su aplicación y establecer explícitamente la clave de acceso temporal que desea utilizar.
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 {
// Set this to the temporary AccessKey ID, AccessKey secret, and security token obtained from the STS service, not the credential information of a RAM user.
// Note that the AccessKey ID obtained from the STS service starts with "STS", as shown below.
String accessKeyId = "STS.****************";
String accessKeySecret = "yourAccessKeySecret";
String stsToken= "yourSecurityToken";
// Use the DefaultCredentialProvider method to directly set the AccessKey ID and AccessKey secret.
CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret, stsToken);
// Use credentialsProvider to initialize the client.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Explicitly declare the use of the V4 signature algorithm.
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
// Create an OSSClient instance.
// When the OSSClient instance is no longer needed, call the shutdown method to release resources.
OSS ossClient = OSSClientBuilder.create()
.endpoint("endpoint")
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region("region")
.build();
ossClient.shutdown();
}
}
Uso de un RAMRoleARN
Recomendado para aplicaciones que necesitan acceso autorizado a OSS, como los accesos entre cuentas. Inicialice el proveedor de credenciales al especificar el ARN de un rol de RAM. El SDK obtiene y actualiza automáticamente los tokens de STS mediante la llamada a la API AssumeRole. También puede usar el parámetro policy para restringir los permisos del rol de RAM.
Una cuenta de Alibaba Cloud tiene todos los permisos sobre sus recursos. Si el par de AccessKey se filtra, representa un riesgo importante para su sistema. No se recomienda utilizar el par de AccessKey de una cuenta de Alibaba Cloud. En su lugar, utilice el par de AccessKey de un usuario de RAM con los permisos mínimos obligatorios.
Para crear un par de AccessKey para un usuario de RAM, consulte Create an AccessKey pair. El AccessKey ID y el AccessKey secret de un usuario de RAM solo se muestran cuando se crea el par de AccessKey. Debe guardarlos de inmediato. Si los olvida, deberá crear un nuevo par de AccessKey para reemplazar el anterior.
Para obtener un RAMRoleARN, consulte Create a RAM role.
-
Agregue la dependencia de credenciales.
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>LATEST</version> </dependency> -
Configure el par de AccessKey y el RAMRoleARN como credenciales de acceso.
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(); // Type of access credential. Set to ram_role_arn. config.setType("ram_role_arn"); // The ARN of the RAM role to assume. Example: acs:ram::123456789012****:role/adminrole. You can set RoleArn through the ALIBABA_CLOUD_ROLE_ARN environment variable. config.setRoleArn("<RoleArn>"); // Obtain the AccessKey ID from the environment variable. config.setAccessKeyId(System.getenv().get("ALIBABA_CLOUD_ACCESS_KEY_ID")); // Obtain the AccessKey secret from the environment variable. config.setAccessKeySecret(System.getenv().get("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); // The name of the role session. You can set RoleSessionName through the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable. config.setRoleName("<RoleSessionName>"); // Set a smaller permission policy. This is optional. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"} config.setPolicy("<Policy>"); // Set the validity period of the role session. This is optional. 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()); } }; // Use credentialsProvider to initialize the client. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); // Explicitly declare the use of the V4 signature algorithm. clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // Create an OSSClient instance. // When the OSSClient instance is no longer needed, call the shutdown method to release resources. OSS ossClient = OSSClientBuilder.create() .endpoint("endpoint") .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region("region") .build(); ossClient.shutdown(); } }
Uso de un ECSRAMRole
Diseñado para escenarios con aplicaciones en instancias de ECS, instancias de ECI o nodos worker de Container Service for Kubernetes. Al adjuntar un rol de RAM a la instancia, los tokens de STS se obtienen y actualizan automáticamente dentro de Container Service for Kubernetes o ECS, sin necesidad de gestionar las credenciales de forma manual. Para obtener un ECSRAMRole, consulte Create a RAM role. Para adjuntar un rol, consulte Instance RAM roles.
-
Agregue la dependencia de credenciales.
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>LATEST</version> </dependency> -
Configure el ECSRAMRole como credencial de acceso.
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(); // Type of access credential. Set to ecs_ram_role. config.setType("ecs_ram_role"); // The name of the RAM role assigned to the ECS instance. 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()); } }; // Use credentialsProvider to initialize the client. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); // Explicitly declare the use of the V4 signature algorithm. clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // Create an OSSClient instance. // When the OSSClient instance is no longer needed, call the shutdown method to release resources. OSS ossClient = OSSClientBuilder.create() .endpoint("endpoint") .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region("region") .build(); ossClient.shutdown(); } }
Uso de un OIDCRoleARN
Después de configurar un rol de RAM para un nodo worker en Container Service for Kubernetes, las aplicaciones ubicadas en pods de ese nodo pueden obtener el token de STS del rol adjunto mediante el servicio de metadatos global, igual que las aplicaciones desplegadas en ECS. Sin embargo, si despliega aplicaciones no confiables en el clúster de contenedores (por ejemplo, aplicaciones enviadas por sus clientes cuyo código usted no conoce), es probable que no desee que obtengan el token de STS del rol de RAM de instancia adjunto al nodo worker mediante dicho servicio. Para evitar riesgos en la seguridad de sus recursos en la nube y permitir que estas aplicaciones obtengan de forma segura los tokens de STS necesarios, utilice la función RAM Roles for Service Accounts (RRSA). Con esta opción se logra minimizar los permisos a nivel de aplicación. La implementación subyacente de este método se basa en un token de STS. El clúster de contenedores de Alibaba Cloud crea y monta el archivo de token OIDC de la cuenta de servicio correspondiente para distintos pods de aplicaciones. Además, inyecta la información de configuración relevante en las variables de entorno. El SDK obtiene el token de STS del rol vinculado al llamar a la operación de API AssumeRoleWithOIDC del servicio STS, utilizando la información de configuración de las variables de entorno. Este método elimina el riesgo de mantener manualmente un par de AccessKey o un token de STS, ya que no necesita proporcionar ninguno. Para obtener más información, consulte Configure RAM permissions for a ServiceAccount through RRSA to achieve pod permission isolation.
-
Agregue la dependencia de credenciales.
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>LATEST</version> </dependency> -
Configure el rol de RAM de OIDC como credencial de acceso.
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(); // Specify the Credential type. Set to oidc_role_arn. config.setType("oidc_role_arn"); // The ARN of the RAM role. You can set RoleArn through the ALIBABA_CLOUD_ROLE_ARN environment variable. config.setRoleArn("<RoleArn>"); // The ARN of the OIDC provider. You can set OidcProviderArn through the ALIBABA_CLOUD_OIDC_PROVIDER_ARN environment variable. config.setOidcProviderArn("<OidcProviderArn>"); // The path to the OIDC token file. You can set OidcTokenFilePath through the ALIBABA_CLOUD_OIDC_TOKEN_FILE environment variable. config.setOidcTokenFilePath("<OidcTokenFilePath>"); // The name of the role session. You can set RoleSessionName through the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable. config.setRoleSessionName("<RoleSessionName>"); // Set a smaller permission policy. This is optional. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"} config.setPolicy("<Policy>"); // Set the session expiration time. 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()); } }; // Use credentialsProvider to initialize the client. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); // Explicitly declare the use of the V4 signature algorithm. clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // Create an OSSClient instance. // When the OSSClient instance is no longer needed, call the shutdown method to release resources. OSS ossClient = OSSClientBuilder.create() .endpoint("endpoint") .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region("region") .build(); ossClient.shutdown(); } }
Uso de credenciales del contexto de Function Compute
Este método está diseñado para funciones de aplicaciones desplegadas en Function Compute. Permite inicializar el proveedor de credenciales con las credenciales del contexto de Function Compute. La implementación subyacente se basa en un token de STS. Function Compute obtiene un token de STS al asumir el rol de servicio configurado para la función y luego lo pasa a su aplicación mediante el parámetro Credentials en el contexto. Este token de STS tiene una validez de 36 horas y no se puede modificar. El tiempo máximo de ejecución de una función es de 24 horas, por lo que el token de STS no expira durante la ejecución y no es necesario actualizarlo. Este método elimina el riesgo de mantener manualmente un par de AccessKey o un token de STS, ya que no necesita proporcionar ninguno. Para otorgar a Function Compute permisos de acceso a OSS, consulte Use a function role to grant Function Compute permissions to access other Alibaba Cloud services.
-
Agregue la dependencia del contexto de 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> -
Inicialice el proveedor de credenciales con las credenciales del contexto de 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 { // Obtain key information. Before execution, ensure that the service where the function resides is configured with role information, and the role has the necessary OSS permissions. We recommend using the AliyunFCDefaultRole role. Credentials creds = context.getExecutionCredentials(); // Use the obtained credentials to create a credential provider instance. CredentialsProvider credentialsProvider = new DefaultCredentialProvider(creds.getAccessKeyId(), creds.getAccessKeySecret(), creds.getSecurityToken()); // Use credentialsProvider to initialize the client. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); // Explicitly declare the use of the V4 signature algorithm. clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // Create an OSSClient instance. // When the OSSClient instance is no longer needed, call the shutdown method to release resources. OSS ossClient = OSSClientBuilder.create() .endpoint("endpoint") .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region("region") .build(); ossClient.shutdown(); outputStream.write(new String("done").getBytes()); } }
Uso de un CredentialsURI
Útil para aplicaciones que recuperan credenciales de un sistema externo con el fin de gestionarlas de manera flexible. Inicialice el proveedor de credenciales con un URI que devuelva tokens de STS. El SDK obtiene y actualiza automáticamente los tokens desde el URI especificado.
-
Para que el SDK analice sintácticamente y utilice correctamente el token de STS, el URI debe seguir este protocolo de respuesta:
Código de estado de la respuesta: 200
-
Estructura del cuerpo de la respuesta:
{ "Code": "Success", "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "SecurityToken" }
-
Agregue la dependencia de credenciales.
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>LATEST</version> </dependency> -
Configure el CredentialsURI como credencial de acceso.
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(); // Type of access credential. Set to credentials_uri. config.setType("credentials_uri"); // The URI of the credential, which is the address of your server that generates STS tokens, in the format http://local_or_remote_uri/. You can set CredentialsUri through the ALIBABA_CLOUD_CREDENTIALS_URI environment variable. 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()); } }; // Use credentialsProvider to initialize the client. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); // Explicitly declare the use of the V4 signature algorithm. clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // Create an OSSClient instance. // When the OSSClient instance is no longer needed, call the shutdown method to release resources. OSS ossClient = OSSClientBuilder.create() .endpoint("endpoint") .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region("region") .build(); ossClient.shutdown(); } }
Uso de un par de AccessKey con rotación automática
Indicado para aplicaciones que requieren acceso prolongado a OSS en entornos con riesgo de filtración de AccessKey. Inicialice el proveedor de credenciales con un ClientKey. KMS rota automáticamente el par de AccessKey del usuario de RAM gestionado, lo que convierte las credenciales estáticas en dinámicas y reduce el riesgo de filtración. KMS también admite la rotación inmediata. Para obtener un ClientKey, consulte Create an application access point.
-
Agregue la dependencia del cliente de credenciales.
<!-- 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> -
Cree el archivo de configuración
secretsmanager.properties.# Type of access credential, fixed as client_key credentials_type=client_key # Decryption password for reading the Client Key: supports reading from an environment variable or a file, only one needs to be set client_key_password_from_env_variable=<your client key private key password environment variable name> client_key_password_from_file_path=<your client key private key password file path> # Path to the Client Key's private key file client_key_private_key_path=<your client key private key file path> # Associated KMS service region cache_client_region_id=[{"regionId":"<regionId>"}] -
Utilice el archivo de configuración para pasar la información de las credenciales.
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; } } }; // Use credentialsProvider to initialize the client. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); // Explicitly declare the use of the V4 signature algorithm. clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // Create an OSSClient instance. // When the OSSClient instance is no longer needed, call the shutdown method to release resources. OSS ossClient = OSSClientBuilder.create() .endpoint("endpoint") .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region("region") .build(); ossClient.shutdown(); } }
Uso de una credencial de acceso personalizada
Si ninguno de los métodos de configuración de credenciales anteriores satisface sus necesidades, personalice el proveedor de credenciales mediante la implementación de la interfaz Credential Providers. Tenga en cuenta que, si la implementación subyacente se basa en un token de STS, deberá implementar la compatibilidad con la actualización de credenciales.
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(){
// Initialize variable
String accessKeyId = null;
// Initialize variable
String accessKeySecrect = null;
// Initialize variable
// String token = null;
@Override
public void setCredentials(Credentials credentials) {
}
@Override
public Credentials getCredentials() {
//TODO
//Customize the method for obtaining access credentials.
// Return long-term credentials: access_key_id, access_key_secrect
return new DefaultCredentials(accessKeyId, accessKeySecrect);
// Return temporary credentials: access_key_id, access_key_secrect, token
// For temporary credentials, you need to refresh them based on their expiration time.
// return new DefaultCredentials(accessKeyId, accessKeySecrect, token);
}
};
// Use credentialsProvider to initialize the client.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Explicitly declare the use of the V4 signature algorithm.
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
// Create an OSSClient instance.
// When the OSSClient instance is no longer needed, call the shutdown method to release resources.
OSS ossClient = OSSClientBuilder.create()
.endpoint("endpoint")
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region("region")
.build();
ossClient.shutdown();
}
}
Uso de la cadena de credenciales predeterminada
Cuando inicializa el cliente de credenciales sin parámetros, el SDK utiliza la cadena de credenciales predeterminada. Para conocer la lógica de la cadena de credenciales, consulte Default credential chain.
-
Agregue la dependencia de credenciales.
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>LATEST</version> </dependency> -
Configure Credentials como credencial de acceso.
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(); // Explicitly declare the use of the V4 signature algorithm. clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // Use credentialsProvider to initialize the client. // Create an OSSClient instance. // When the OSSClient instance is no longer needed, call the shutdown method to release resources. OSS ossClient = OSSClientBuilder.create() .endpoint("endpoint") .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region("region") .build(); ossClient.shutdown(); } }
Preguntas frecuentes
Conflictos de paquetes
-
Causa
Cuando utiliza el SDK de Java V1 para OSS, un error similar al siguiente indica que existe un conflicto de paquetes en su proyecto.
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 moreo bien
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)El error ocurre porque el SDK de Java V1 para OSS utiliza Apache HttpClient 4.4.1, pero su proyecto usa una versión incompatible de Apache HttpClient o un paquete JAR de commons-httpclient. Ejecute el comando
mvn dependency:treeen el directorio de su proyecto para ver los paquetes JAR y las versiones que utiliza. En este caso, el proyecto usa Apache HttpClient 4.3, lo cual entra en conflicto con la versión estándar:[INFO] --- maven-dependency-plugin:2.2:tree (default-cli) @ maven-demo --- [INFO] com.aliyun.oss:maven-demo:jar:0.1.1-SNAPSHOT [INFO] +- junit:junit:jar:4.10:test [INFO] | \- org.hamcrest:hamcrest-core:jar:1.1:test [INFO] +- org.apache.httpcomponents:httpclient:jar:4.3:compile [INFO] | +- org.apache.httpcomponents:httpcore:jar:4.3:compile [INFO] | +- commons-logging:commons-logging:jar:1.1.3:compile [INFO] | \- commons-codec:commons-codec:jar:1.6:compile [INFO] \- com.aliyun.oss:aliyun-sdk-oss:jar:2.2.1:compile [INFO] +- org.jdom:jdom:jar:1.1:compile [INFO] \- net.sf.json-lib:json-lib:jar:jdk15:2.4:compile [INFO] +- commons-beanutils:commons-beanutils:jar:1.8.0:compile [INFO] +- commons-collections:commons-collections:jar:3.2.1:compile [INFO] +- commons-lang:commons-lang:jar:2.5:compile [INFO] \- net.sf.ezmorph:ezmorph:jar:1.0.6:compile -
Solución
Resuelva los conflictos de paquetes de una de las dos maneras siguientes:
Unificar la versión: si su proyecto utiliza una versión que entra en conflicto con Apache HttpClient 4.4.1, actualice el proyecto para usar la versión 4.4.1 y elimine las dependencias de otras versiones de Apache HttpClient del archivo
pom.xml. Si su proyecto usa commons-httpclient, también podría existir un conflicto. Elimine la dependencia de commons-httpclient.Resolver conflictos de dependencias: si su proyecto depende de varios paquetes de terceros y estos dependen a su vez de distintas versiones de Apache HttpClient, se generarán conflictos de dependencias. Utilice la etiqueta exclusion para resolverlos. Para obtener más información, consulte Guías de Maven.
El SDK de Java V1 para OSS depende de las siguientes versiones de paquetes. El método para resolver conflictos es similar al de HttpClient.
[INFO] com.aliyun.oss:maven-demo:jar:0.1.1-SNAPSHOT [INFO] +- junit:junit:jar:4.10:test [INFO] | \- org.hamcrest:hamcrest-core:jar:1.1:test [INFO] \- com.aliyun.oss:aliyun-sdk-oss:jar:2.2.1:compile [INFO] +- org.apache.httpcomponents:httpclient:jar:4.4.1:compile [INFO] | +- org.apache.httpcomponents:httpcore:jar:4.4.1:compile [INFO] | +- commons-logging:commons-logging:jar:1.2:compile [INFO] | \- commons-codec:commons-codec:jar:1.9:compile [INFO] +- org.jdom:jdom:jar:1.1:compile [INFO] \- net.sf.json-lib:json-lib:jar:jdk15:2.4:compile [INFO] +- commons-beanutils:commons-beanutils:jar:1.8.0:compile [INFO] +- commons-collections:commons-collections:jar:3.2.1:compile [INFO] +- commons-lang:commons-lang:jar:2.5:compile [INFO] \- net.sf.ezmorph:ezmorph:jar:1.0.6:compile
Paquetes faltantes
-
Causa
Cuando utiliza OSS Java SDK V1, un error similar al siguiente indica que a su proyecto le podrían faltar paquetes necesarios para compilar o ejecutar OSS Java SDK V1.
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 moreo
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 moreo
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 moreOSS Java SDK V1 depende de los siguientes paquetes:
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
De estos, log4j-1.2.15.jar es una dependencia opcional. Agregue este paquete solo cuando necesite la funcionalidad de registro. Los demás paquetes son obligatorios.
-
Solución
Agregue a su proyecto los paquetes de los que depende OSS Java SDK V1. Utilice uno de los métodos a continuación:
Proyecto de Eclipse: consulte Install the SDK.
Proyecto de Ant: coloque los paquetes de los que depende OSS Java SDK V1 en el directorio lib de su proyecto.
Compilación directa: use el comando
-classpatho-cppara especificar la ruta de los paquetes de los que depende OSS Java SDK V1, o bien coloque estos paquetes en el classpath.
Tiempo de espera de conexión agotado
-
Causa
Al ejecutar un programa de OSS Java SDK V1, puede producirse un error similar al siguiente debido a un endpoint incorrecto o a problemas de conectividad de red.
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 -
Solución
Utilice la herramienta ossutil para localizar rápidamente la causa del error y resolver el problema.
Error SignatureDoesNotMatch
-
Causa 1: información del par de AccessKey no coincidente
El AccessKey ID y el AccessKey secret no coinciden. Para obtener información sobre cómo conseguir un AccessKey ID y un AccessKey secret, consulte Create an AccessKey pair.
-
Causa 2: uso incorrecto de una URL firmada
A continuación se muestra un ejemplo incorrecto de uso de una URL firmada:
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);Si no se especifica el parámetro Method, se usa de forma predeterminada el método GET. Sin embargo, el ejemplo anterior corresponde a una solicitud PutObject. Por lo tanto, debe especificar el parámetro Method y establecerlo en PUT.
Cuando envía una solicitud PutObject, los metadatos personalizados del encabezado de la solicitud deben llevar el prefijo
x-oss-meta-. En el ejemplo anterior, los metadatos personalizados deberían cambiarse ax-oss-meta-author.Solución: especifique el parámetro Method y modifique el prefijo del encabezado.
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); -
Causa 3: problema de compatibilidad de la versión de HttpClient
Se utiliza una versión de OSS SDK anterior a la 3.7.0 y se introdujo HttpClient 4.5.9 o posterior en el proyecto.
El nombre del archivo cargado contiene el carácter
+, y HttpClient 4.5.9 no aplica codificación URL al carácter+. Esto provoca que las firmas calculadas por el cliente y el servidor sean inconsistentes.
320 POST /a HTTP/1.1 (application/json) 107 HTTP/1.1 200 (application/json) 453 PUT /%E4%B8%AD%E6%96%87%2B%E6%B5%8B%E8%AF%95 HTTP/1.1 375 HTTP/1.1 200 OK 364 POST /p HTTP/1.1 (application/json) 1108 HTTP/1.1 200 (application/json) 1017 POST /a HTTP/1.1 (application/json) 107 HTTP/1.1 200 (application/json) 450 PUT /%E4%B8%AD%E6%96%87+%E6%B5%8B%E8%AF%95 HTTP/1.1 1183 HTTP/1.1 403 Forbidden 325 POST /a HTTP/1.1 (application/json) 107 HTTP/1.1 200 (application/json)Solución: utilice uno de los métodos a continuación.
Actualice OSS SDK a la versión 3.11.1 o posterior para que sea compatible con HttpClient 4.5.9.
Elimine las dependencias redundantes de HttpClient. Cuando introduce OSS SDK, la dependencia de HttpClient se agrega automáticamente. Si una biblioteca de terceros también introduce HttpClient, consulte la solución en Package conflicts.
-
Causa 4: problema de compatibilidad del juego de caracteres de HttpClient
HttpClient 4.5.10 no admite caracteres fuera del estándar ISO-8859-1 en el encabezado. En un proyecto que utiliza una versión de HttpClient posterior a la 4.5.10, se produce un problema si el encabezado de la solicitud contiene caracteres fuera del estándar ISO-8859-1, como caracteres chinos en metadatos personalizados que comienzan con
x-oss-meta-.String content = "123"; ObjectMetadata metadata = new ObjectMetadata(); metadata.setHeader("x-oss-meta-filename", "xxx"); PutObjectRequest request = new PutObjectRequest(bucketName, objectName, new ByteArrayInputStream(content.getBytes())); request.setMetadata(metadata); ossClient.putObject(request);Solución: utilice uno de los métodos a continuación.
Consulte la solución en Package conflicts para eliminar la versión de HttpClient que genera el conflicto.
Pase únicamente caracteres que cumplan con el estándar ISO-8859-1 en el encabezado de la solicitud.
Excepción "Failed to parse the response result"
com.aliyun.oss.OSSException: Failed to parse the response result.
[ErrorCode]: InvalidResponse
[RequestId]: null
[HostId]: null
at com.aliyun.oss.common.utils.ExceptionFactory.createOSSException(ExceptionFactory.java:109)
at com.aliyun.oss.common.utils.ExceptionFactory.createInvalidResponseException(ExceptionFactory.java:91)
at com.aliyun.oss.common.utils.ExceptionFactory.createInvalidResponseException(ExceptionFactory.java:81)
at com.aliyun.oss.internal.OSSErrorResponseHandler.handle(OSSErrorResponseHandler.java:71)
at com.aliyun.oss.common.comm.ServiceClient.handleResponse(ServiceClient.java:248)
at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:130)
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:149)
at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:113)
at com.aliyun.oss.internal.OSSObjectOperation.getObject(OSSObjectOperation.java:273)
at com.aliyun.oss.internal.OSSObjectOperation.getObject(OSSObjectOperation.java:301)
at com.aliyun.oss.OSSClient.getObject(OSSClient.java:545)
-
Causa
Algún software especial del lado del cliente intercepta la solicitud HTTP, o bien una ruta de red pública secuestra la solicitud HTTP.
Está utilizando OSS Java SDK V1 en Java 9 o posterior y no ha agregado las dependencias relacionadas con JAXB al archivo pom.xml.
-
Solución
Cambie a una solicitud HTTPS.
Agregue las dependencias relacionadas con JAXB. Para conocer el procedimiento, consulte Install the SDK.
org.apache.http.NoHttpResponseException: The target server failed to respond
-
Causa
Al ejecutar un programa de OSS Java SDK V1, se reporta un error similar al siguiente:
com.aliyun.oss.ClientException: Unknown at com.aliyun.oss.common.utils.ExceptionFactory.createNetworkException(ExceptionFactory.java:68) ~[aliyun-sdk-oss-2.1.0.jar:na] at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:115) ~[aliyun-sdk-oss-2.1.0.jar:na] at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:121) ~[aliyun-sdk-oss-2.1.0.jar:na] at com.aliyun.oss.common.comm.ServiceClient.sendRequest(ServiceClient.java:67) ~[aliyun-sdk-oss-2.1.0.jar:na] at com.aliyun.oss.internal.OSSOperation.send(OSSOperation.java:92) ~[aliyun-sdk-oss-2.1.0.jar:na] at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:140) ~[aliyun-sdk-oss-2.1.0.jar:na] at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:111) ~[aliyun-sdk-oss-2.1.0.jar:na] at com.aliyun.oss.internal.OSSMultipartOperation.initiateMultipartUpload(OSSMultipartOperation.java:206) ~[aliyun-sdk-oss-2.1.0.jar:na] at com.aliyun.oss.OSSClient.initiateMultipartUpload(OSSClient.java:765) ~[aliyun-sdk-oss-2.1.0.jar:na] at com.taobao.agoo.dump.client.OssTools.multipartUpload(OssTools.java:79) ~[agoo-dump-client-2.0.0-SNAPSHOT.jar:na] at com.taobao.agoo.dump.biz.manager.TaskExecutorManager$UploadTask.run(TaskExecutorManager.java:114) ~[agoo-dump-biz-2.0.0-SNAPSHOT.jar:na] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [na:1.7.0_51] at java.util.concurrent.FutureTask.run(FutureTask.java:262) [na:1.7.0_51] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_51] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_51] at java.lang.Thread.run(Thread.java:744) [na:1.7.0_51] Caused by: org.apache.http.NoHttpResponseException: The target server failed to respond at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:143) ~[httpclient-4.4.jar:4.4] at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57) ~[httpclient-4.4.jar:4.4] at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:261) ~[httpcore-4.4.jar:4.4] at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:165) ~[httpcore-4.4.jar:4.4] at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:167) ~[httpclient-4.4.jar:4.4] at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:272) ~[httpcore-4.4.jar:4.4]El uso de una conexión caducada provoca el error anterior. Este error solo ocurre en versiones del SDK de Java anteriores a la 2.1.2.
-
Solución
Actualice OSS Java SDK V1 a la versión 2.1.2 o posterior.
Existen muchas instancias de org.apache.http.impl.conn.PoolingHttpClientConnectionManager en la JVM
-
Causa
ossClient no se cerró correctamente.
-
Solución
Cierre ossClient después de que termine de ejecutarse o utilice el patrón singleton.
La llamada a OSS Java SDK V1 no responde
-
Causa
Una llamada a OSS Java SDK V1 no responde. Al ejecutar el comando
jstack -l pidpara consultar la pila, puede ubicar el problema en la siguiente posición:"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)La causa es una fuga de conexiones en el pool de conexiones, posiblemente porque ossObject no se cerró correctamente después de usarse.
-
Solución
Revise su programa para asegurarse de que no haya fugas de conexiones. Utilice el siguiente método para cerrar la conexión correctamente:
// Read the file. OSSObject ossObject = ossClient.getObject(bucketName, objectName); // OSS operation // Close ossObject. ossObject.close();
Conexión cerrada
-
Causa
Si encuentra un error similar al siguiente al usar 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)La causa es que el intervalo entre dos lecturas de datos supera 1 minuto. OSS cierra las conexiones que han estado inactivas durante más de 1 minuto.
-
Solución
Si cada vez lee solo una parte de los datos y el tiempo de procesamiento varía, utilice la descarga por rangos para evitar que se cierre la conexión. La conexión se cierra automáticamente cuando finaliza la descarga por rangos. Range download (OSS Java SDK V1).
Fuga de memoria
-
Causa
Un programa que llama a OSS Java SDK V1 presenta una fuga de memoria después de ejecutarse durante cierto tiempo (desde unas horas hasta varios días, según el volumen de negocio). Se recomienda utilizar Eclipse Memory Analyzer (MAT) para analizar el uso de memoria. Para obtener más información, consulte Analizar archivos de volcado de montículo con MAT.
Si el resultado del análisis es similar al de la siguiente imagen (PoolingHttpClientConnectionManager ocupa el 96 % de la memoria), la causa es que
new OSSClientpudo haberse ejecutado varias veces en el programa, pero no se llamó aossClient.shutdown, lo cual provocó la fuga de memoria.
-
Solución
Una vez que finalice la operación
new OSSClient, llame al métodoshutdownpara cerrarla. Asegúrese de quenew OSSClientyossClient.shutdownse utilicen en pares.
Se reporta InterruptedException al llamar a ossClient.shutdown
-
Causa
Las versiones de OSS Java SDK V1 anteriores a la 2.3.0 reportan la siguiente excepción al llamar a
ossClient.shutdown:java.lang.InterruptedException: sleep interrupted at java.lang.Thread.sleep(Native Method) at com.aliyun.oss.common.comm.IdleConnectionReaper.run(IdleConnectionReaper:76)La causa es que el hilo de backend de ossClient, IdleConnectionReaper, cierra periódicamente las conexiones inactivas. Si se llama a ossClient.shutdown mientras IdleConnectionReaper está en estado Sleep, se reporta la excepción anterior.
-
Solución
Utilice el siguiente código para ignorar la excepción:
try { ossClient.shutdown(); } catch(Exception e) { }
Excepción "SDK.ServerUnreachable : Speicified endpoint or uri is not valid"
SunshineE/android/01040181-2018-05-07173747-860769-online=1.jpg</cloudUrl><fileSize>4096</fileSize><lossName/><loss
...skipping...
com.aliyuncs.exceptions.ClientException: SDK.ServerUnreachable : Speicified endpoint or uri is not valid.
at com.aliyuncs.DefaultAcsClient.doAction(DefaultAcsClient.java:201)
at com.aliyuncs.DefaultAcsClient.doAction(DefaultAcsClient.java:151)
at com.aliyuncs.DefaultAcsClient.doAction(DefaultAcsClient.java:59)
at com.aliyuncs.DefaultAcsClient.getAcsResponse(DefaultAcsClient.java:103)
at com.sunyard.insurance.oss.aliyun.GetSts.assumeRole(GetSts.java:50)
at com.sunyard.insurance.oss.aliyun.GetSts.getSts(GetSts.java:60)
at com.sunyard.insurance.ecm.web.action.oss.OssInfoAction.getUpOssInfo(OssInfoAction.java:259)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
-
Causa
El cliente envía demasiadas solicitudes simultáneas a STS.
La conexión de red con el servidor agota el tiempo de espera.
El SDK de STS y el núcleo del SDK utilizados no son las versiones más recientes.
-
Solución
Reduzca la concurrencia de OSS. Si el cliente envía demasiadas solicitudes simultáneas a STS, es posible que la instancia ECS del cliente o la computadora local no puedan manejar la carga.
La conexión de red del usuario al servidor agota el tiempo de espera. Puede capturar paquetes para comprobarlo.
Actualice el SDK de STS y el núcleo del SDK a las versiones más recientes.
NoSuchKey
case:java.lang.Exception: com.aliyun.oss.OSSException:
Not Foundn[ErrorCode]: NoSuchKeyn
-
Causa
El archivo de origen no existe.
-
Solución
SocketException
2018-10-10 16:21:11,127 ERROR com.qunhe.instdeco.plan.maxservice.convert.Converter
downloadOssObject:taskId:LO63HXQKN4BMWM4BAU888888:
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:128)
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:149)
at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:113)
at com.aliyun.oss.internal.OSSObjectOperation.getObject(OSSObjectOperation.java:273)
-
Causa
Es posible que el socket haya fallado durante la fase de inicialización, lo que provoca que la solicitud falle antes de llegar a OSS.
-
Solución
Se recomienda comprobar los siguientes aspectos:
Si hubo inestabilidad en la red cuando apareció el problema.
Si la cantidad de conexiones de socket en el host alcanzó su límite.
Compruebe si la cantidad de conexiones superó el valor de maxconnection configurado en el SDK cuando ocurrió el problema. Si la cantidad de conexiones supera dicho valor, también se producirá una excepción de socket.
Si no hay problemas con lo anterior, se recomienda implementar tcpdump o Wireshark para capturar paquetes y luego analizar los paquetes de datos una vez que el problema vuelva a ocurrir.
No se activa la devolución de llamada de OSS PostObject
La devolución de llamada de OSS PostObject no se activa, pero PutObject sí activa la misma devolución de llamada. Por lo general, si el formato JSON es incorrecto o la devolución de llamada falla, se devuelve un mensaje correspondiente. En este caso, debe probar por separado el comportamiento de devolución de llamada de Put y de Post:
La siguiente captura de Wireshark muestra una solicitud HTTP POST de devolución de llamada de OSS y la respuesta del servidor:
POST /RevIce.ashx HTTP/1.1
Host: 47.xx.xxx.168
Connection: close
Content-Length: xxx
Authorization: xxx
Content-MD5: KdeBTxxx
Content-Type: appli...
User-Agent: aliyun-xxx
x-oss-additional-he...
x-oss-bucket: null8
x-owner: A4A64...
x-oss-pub-key-url: xxx
x-oss-request-id: xxx
x-oss-signature-ver...
x-oss-tag: CALLBACK
eagleye-rpcid: 0.1
bucket: xxx
HTTP/1.1 200 OK
Cache-Control: private
Transfer-Encoding: chunked
Content-Type: text/plain
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 12 Feb 2018 02:52:44 GMT
Connection: close
{"a":"b"}
-
Causa
Al enviar la solicitud, el parámetro
callbackse colocó incorrectamente dentro del parámetrofile.LTAI*xxx --94311149156168 Content-Disposition: form-data; name="policy" eyjleHBpcmF0aW9UIjogIjIxMjAtMDEtMDFU --94311149156168 Content-Disposition: form-data; name="Signature" gncf07Apde0vqaMWBto18XxzoH0= --94311149156168 Content-Disposition: form-data; name="file"; filename="1.txt" Content-Type: text/plain --94311149156168 Content-Disposition: form-data; name="callback" eyJ3YWxsYmFja1VybCI6Imh0dHA6Ly9vc3MtZGVtby5hbGl5dW5jcy5jb20eyJ3YWxsYmFja1VybCI6ImhxMTYxMTYxNjE2MTYxNjE2 12345678910 --94311149156168-- HTTP/1.1 204 No Content Server: AliyunOSS Date: xxx -
Solución
Ajuste la posición de los parámetros callback y file.
Content-Disposition: form-data; name="policy" eyjleHBpcmF0aW9uIjogIjIxMjAtMDEtMDFUMTI6MDA6MDAuMDAwWiIs]xxx --9431149156168 Content-Disposition: form-data; name="Signature" gncf07Apde0vqaMWBtol8XxzoH0= --9431149156168 Content-Disposition: form-data; name="callback" eyJjYWxsYmFja1VybCI6Imh0dHA6Ly80xxx MTYuMTY4LjFxxxIn0= --9431149156168 Content-Disposition: form-data; name="file"; filename="1.txt" Content-Type: text/plain 12345678910 --9431149156168-- HTTP/1.1 200 OK Server: AliyunOSS Date: Mon, 12 Feb 2018 06:39:22 GMT Content-Type: application/jsonEn este punto, el resultado de la prueba muestra que el servidor de negocios capturó correctamente la solicitud.
POST /Revice.ashx HTTP/1.1 Host: 47.93.116.168 Connection: close Content-Length: 26 Authorization: kn8kVDJOdte9CHcRX1=xxx Content-Type: application/x-www-xxx Date: Mon, 12 Feb 2018 06:40:54 User-Agent: aliyun-oss-callback x-oss-additional-headers: x-oss-bucket: ruide x-oss-owner: 44414 x-oss-pub-key-url: aHR0cHM6Ly9nb2xxx...SuZN= x-oss-request-id: 5A8136F6002618Hxxx x-oss-requester: 232379785371xxx x-oss-signature-version: 1.0 x-oss-tag: CALLBACK eagleeye-rpcid: 0.1 {"bucket"=ruide,"size"=11} HTTP/1.1 200 OK Cache-Control: private Transfer-Encoding: chunked Content-Type: text/plain Server: Microsoft-IIS/7.5 X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Mon, 12 Feb 2018 06:40:54 GMT Connection: close {"a":"b"}
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
-
Causa
Continúa enviando solicitudes a través de ossClient después de llamar al método
ossClient.shutdown(). -
Solución
Revise su lógica de llamadas para asegurarse de que, después de llamar al método
ossClient.shutdown(), ya no envíe solicitudes a través de ossClient.
Error "Request has expired" en las solicitudes generadas por generatePresignedUrl del SDK de Java
-
Causa
Un desbordamiento de entero provoca un problema de marca de tiempo relacionado con el problema del año 2038.
Se inicia una solicitud de carga después del tiempo de caducidad establecido para la URL.
-
Solución
Si se trata de un desbordamiento de entero, se recomienda que la duración de caducidad en el SDK de Java no supere el año 2038.
Si se inicia una solicitud de carga después del tiempo de caducidad establecido para la URL, establezca un tiempo de caducidad razonable para garantizar que sea posterior al momento en que inicia la solicitud.
Error "Invalid Response" o "Implementation of JAXB-API has not been found on module path or classpath"
-
Causa
Está utilizando Java 9 o posterior y no ha agregado la dependencia de JAXB.
-
Solución
Para obtener información sobre cómo agregar la dependencia de JAXB, consulte Install the SDK.
¿OSSClient en OSS Java SDK V1 es seguro para hilos?
OSSClient es seguro para hilos, lo que permite que varios hilos accedan a la misma instancia. Según sus necesidades de negocio, puede reutilizar una sola instancia de OSSClient o crear varias instancias.
Una instancia de OSSClient mantiene internamente un pool de conexiones. Cuando una instancia de OSSClient ya no sea necesaria, debe llamar al método shutdown para cerrarla y evitar el agotamiento de recursos por crear demasiadas instancias de OSSClient.
Se reporta el error "AccessDenied Hierarchical namespace is disabled"
-
Causa
El espacio de nombres jerárquico no estaba habilitado antes de llamar a la operación de API CreateDirectory, Rename o DeleteDirectory.
-
Solución
Habilite el espacio de nombres jerárquico cuando cree un bucket. Para conocer el procedimiento específico, consulte Create a bucket.
La red del cliente funciona con normalidad, pero se reporta un error "Connection reset" durante el acceso HTTP. ¿Cómo lo soluciono?
Los proveedores de servicios en algunas regiones pueden secuestrar el nombre de dominio de OSS. Configure HTTPS mediante el endpoint. Configure the client.
Java 17 Cannot invoke "java.lang.reflect.Method.invoke(Object, Object[])" because "com.sun.xml.bind.v2.runtime.reflect.opt.Injector.defineClass" is null
-
Causa
JAXB se marcó como obsoleto en Java 9 y se eliminó en Java 11.
-
Solución
Agregue las siguientes dependencias:
<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>
¿Cómo configuro la impresión de registros internos para el SDK de Java?
El SDK de Java utiliza el framework Apache Commons Logging (JCL) para la impresión de registros. JCL puede usar varios frameworks de implementación de registros. Para obtener más información, consulte JCL-Configuration. Los más comunes son JCL sobre log4j o JCL sobre SLF4j. Los métodos de implementación son los siguientes:
JCL sobre log4j: debe introducir la dependencia de log4j (log4j 2.x tiene varios frameworks de implementación para elegir; los predeterminados son log4j-api+log4j-core) y configurarla según el método de configuración de log4j. Para conocer el proceso específico, consulte APACHE LOG4J-API Separation.
JCL sobre slf4j: debe introducir las dependencias jcl-over-slf4j y slf4j (slf4j también tiene varios frameworks de implementación para elegir, como slf4j-api+logback-classic) y configurarlo según el método de configuración de slf4j. Para conocer el proceso específico, consulte SJF4J-Bridging legacy APIs.
Apache Log4j define distintos niveles de registro, incluidos OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE y ALL.
Puede habilitar o deshabilitar los registros del SDK al configurar las propiedades de log4j:
#
log4j.appender.DRFA=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DRFA.File=${ossdemo.log.dir}/${ossdemo.log.file}
# Rollver at midnight
log4j.appender.DRFA.DatePattern=.yyyy-MM-dd
# 30-day backup
#log4j.appender.DRFA.MaxBackupIndex=30
log4j.appender.DRFA.layout=org.apache.log4j.PatternLayout
# Pattern format: Date LogLevel LoggerName LogMessage
log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
# Debugging Pattern format
#log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n
#
# console
# Add "console" to rootlogger above if you want to use this
#
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
log4j.logger.org.apache.http=off
# oss log level
log4j.logger.com.aliyun.oss=DEBUG
Actualizar a OSS Java SDK V2
OSS Java SDK V2 ya está disponible. Ofrece una API simplificada y mecanismos de reintento mejorados. Para migrar de V1 a V2, consulte Java SDK V1 to V2 Migration Guide.