2009-03-01 5 views
14

Sto creando un plug-in Eclipse che comunica con un'interfaccia REST che utilizza l'autenticazione di base. Quando l'autenticazione fallisce, desidero visualizzare la finestra di dialogo delle impostazioni del mio plug-in e riprovare. Normalmente potrei usare lo statico Authenticator.setDefault() per configurare un autenticatore per tutti gli HttpURLConnection per questo, ma poiché sto scrivendo un plugin non voglio sovrascrivere il valore predefinito di Eclipse Authenticator (org.eclipse.ui.internal.net.auth);Java Authenticator su base per connessione?

Ho pensato di impostare il mio Authenticator personalizzato prima di caricare e ripristinare in seguito il default di Eclipse, ma immagino che questo causerà tutti i tipi di problemi di gara con il multithreading, quindi ho rapidamente perso questa nozione.

ricerche di Google apportato tutti i tipi di risultati fondamentalmente mi dice che non è possibile:

L'API Java URLConnection dovrebbe avere un setAuthenticator (Authenticator) metodo per fare più facile da usare questa classe in un contesto multi-threaded in cui l'autenticazione è richiesta

Source

Se le applicazioni contiene alcuni plugin di terze parti e ogni plugin usare il proprio autenticatore cosa dovremmo fare? Ogni invocazione del metodo "Authenticator.setDefault()" riscrivere precedentemente definiti Authenticator ...

Source

Esistono diversi approcci che potrebbero aiutare a superare questo problema?

+0

+1 Ho lo stesso problema. Molto noioso! –

risposta

8

Se non è possibile con HttpURLConnection, suggerirei di utilizzare la libreria httpclient da Apache.

Un esempio veloce:

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

yeah Il client http di apache commoms è ciò che avevo deciso di usare se questo problema con il JREr HttpURLConnection predefinito è onomercabile. Grazie per la risposta però! –

+0

Alla fine optare per una classe Http di terze parti era l'unica soluzione praticabile, quindi accetterò la tua risposta. –

1

Un altro approccio sarebbe quello di eseguire l'autenticazione di base da soli sulla connessione.

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); 

Ciò avrebbe anche il vantaggio di non richiedere una richiesta autenticato di ricevere un 401 prima di fornire il credenziali su una successiva richiesta. Un comportamento simile può essere sfruttato nel client http di apache richiedendo l'autenticazione preventiva.