2012-05-07 13 views
13

Estoy usando Java para acceder a un sitio HTTPS que devuelve la visualización en un formato XML. Paso las credenciales de inicio de sesión en la URL misma. Este es el fragmento de código:Código de respuesta HTTP devuelto del servidor: 401 para URL: https

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
requestURL = "https://Administrator:[email protected]:8443/abcd"; 

try { 
     InputStream is = null; 
     URL url = new URL(requestURL); 
     InputStream xmlInputStream =new URL(requestURL).openConnection().getInputStream(); 
     byte[] testByteArr = new byte[xmlInputStream.available()]; 
     xmlInputStream.read(testByteArr); 
     System.out.println(new String(testByteArr)); 
     Document doc = db.parse(xmlInputStream); 
     System.out.println("DOC="+doc); 
    } catch (MalformedURLException e) { 
    } 

Estoy creando un gestor de confianza en el programa que no valida firmado/certificados firmados. Pero, sobre cómo ejecutar el programa anterior, me sale el error de servidor código de respuesta HTTP devueltos: 401 URL: https://Administrator:[email protected]:8443/abcd

puedo usar la misma URL en mi navegador y muestra el código XML correctamente. Amablemente déjame saber cómo hacer que esto funcione dentro del programa Java.

Respuesta

24

401 significa "No autorizado", por lo que debe haber algo con sus credenciales.

Creo que java URL no es compatible con la sintaxis que está mostrando. Podría usar un Autenticador en su lugar.

Authenticator.setDefault(new Authenticator() { 

    @Override 
    protected PasswordAuthentication getPasswordAuthentication() {   
     return new PasswordAuthentication(login, password.toCharArray()); 
    } 
}); 

y luego simplemente invocando la url normal, sin las credenciales.

La otra opción es proporcionar las credenciales en un encabezado:

String loginPassword = login+ ":" + password; 
String encoded = new sun.misc.BASE64Encoder().encode (loginPassword.getBytes()); 
URLConnection conn = url.openConnection(); 
conn.setRequestProperty ("Authorization", "Basic " + encoded); 

PS: No se recomienda el uso que Base64Encoder pero esto es sólo para mostrar una solución rápida. Si desea mantener esa solución, busque una biblioteca que sí lo haga. Hay bastantes.

+1

Gracias Guillaume Polet. La segunda opción funcionó a las mil maravillas. Lo necesito solo para las pruebas internas, así que creo que eso podría ser suficiente. – Vish

+1

gracias Polet. la segunda opción me ayudó. –

1

Pruebe esto. Necesita pasar la autenticación para que el servidor sepa que es un usuario válido. Debe importar estos dos paquetes y debe incluir un jersy jar. Si no desea incluir frasco Jersy luego importar este paquete

import sun.misc.BASE64Encoder; 

import com.sun.jersey.core.util.Base64; 
import sun.net.www.protocol.http.HttpURLConnection; 

y luego,

String encodedAuthorizedUser = getAuthantication("username", "password"); 
URL url = new URL("Your Valid Jira URL"); 
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection(); 
httpCon.setRequestProperty ("Authorization", "Basic " + encodedAuthorizedUser); 

public String getAuthantication(String username, String password) { 
    String auth = new String(Base64.encode(username + ":" + password)); 
    return auth; 
} 
Cuestiones relacionadas