2009-03-01 22 views
14

Estoy construyendo un plugin de Eclipse que se comunica con una interfaz REST que usa la Autenticación básica. Cuando la autenticación falla, me gustaría abrir el cuadro de diálogo de configuración de mi complemento y volver a intentarlo. Normalmente podría usar el Authenticator.setDefault() estático para configurar un autenticador para todos los HttpURLConnection's para esto, pero como estoy escribiendo un plugin no quiero sobreescribir el predeterminado Authenticator de Eclipse (org.eclipse.ui.internal.net.auth);Java Authenticator por conexión?

Pensé en configurar mi Authenticator personalizado antes de cargar y volver a poner el valor predeterminado de Eclipse después, pero imagino que esto causará todo tipo de problemas de raza con el multihilo, así que rápidamente perdí esa noción.

búsquedas de Google entregan todo tipo de resultados básicamente me dice que no es posible:

El API Java URLConnection debe tener un setAuthenticator (autenticador) método para hacer más fácil el uso de esta clase en el contexto multi-hilo, donde se requiere autenticacion.

Source

Si las aplicaciones contienen algunos plugins de terceros y cada plugin utilizar su propio autenticador lo que debemos hacer? Cada invocación de método "Authenticator.setDefault()" reescriben previamente definido autenticador ...

Source

¿Hay enfoques diferentes que pueden ayudar a superar este problema?

+0

+1 Tengo el mismo problema. ¡Muy molesto! –

Respuesta

8

Si no es posible con HttpURLConnection sugeriría usar la biblioteca httpclient de Apache.

Un ejemplo rápido:

HttpClient client = new HttpClient(); 
client.getState().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("test","test")); 
GetMethod getMethod = new GetMethod("http://www.example.com/mylogin"); 
client.executeMethod(getMethod); 
System.out.println(getMethod.getResponseBodyAsString()); 
+0

sí, el cliente HTTP de apache commoms es lo que había decidido utilizar si se supera este problema con JRE predeterminado HttpURLConnection. ¡Gracias por la respuesta! –

+0

Al final optar por una tercera clase de Http fue la única solución viable, por lo que aceptaré su respuesta. –

1

Otro enfoque sería llevar a cabo la autenticación básica a sí mismo en la conexión.

final byte[] encodedBytes = Base64.encodeData((username + ':' + new String(password)).getBytes("iso-8859-1")); 
    final String encoded = new String(encodedBytes, "iso-8859-1"); 

    connection.setRequestProperty("Authorization", "Basic " + encoded); 

Esto también tendría la ventaja de no requerir una solicitud no autenticado para recibir un 401 antes de proporcionar la credencial en una solicitud posterior. Se puede aprovechar un comportamiento similar en apache http-client solicitando autenticación preventiva.

Cuestiones relacionadas