Accediendo a un sitio HTTP/HTTPS desde Java

14Feb08

En este post veremos como realizar conexiones tanto a sitios HTTP como a sitios HTTPS desde Java. Para ello utilizaremos las clases URLConnection y Authenticator (para el caso especial de HTTPS)


Clase URLConnection

URLConnection es una clase abstracta que implementan todas aquellas clases que quieren mantener un vinculo entre una aplicación y una URL determinada.

Si invocamos al método openConnection de URL, nos devolverá la implementación de URLConnection más apropiada a utilizar.

Por ejemplo si realizamos:

URL url = new URL("https://lefunes.wordpress.com");
URLConnection con = url.openConnection();

dentro de con tendremos un objeto HttpURLConnection, mientras que si la URL hubiese sido HTTPS tendríamos despues del openConnection un objeto HttpsURLConnection.

Accediendo a un sitio HTTP

Abrimos un URLConnection a partir de la URL especificada, como por ejemplo:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class Main {
   public static void main(String[] args)
     throws MalformedURLException, IOException {
      URL url = new URL("https://lefunes.wordpress.com");
      URLConnection con = url.openConnection();

      BufferedReader in = new BufferedReader(
         new InputStreamReader(con.getInputStream()));

      String linea;
      while ((linea = in.readLine()) != null) {
         System.out.println(linea);
      }
   }
}

Accediendo a un sitio HTTPS

Al igual que en el caso anterior especifiquemos una URL, pero ahora una cuyo protocolo sea HTTPS, por lo que tendremos:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class Main {
   public static void main(String[] args)
    throws MalformedURLException, IOException {
      URL url = new URL("https://algun_servidor...");
      URLConnection con = url.openConnection();

      BufferedReader in = new BufferedReader(
         new InputStreamReader(con.getInputStream()));

      String linea;
      while ((linea = in.readLine()) != null) {
         System.out.println(linea);
      }
   }
}

Si ejecutamos este código tendremos la siguiente excepción:

Exception in thread “main” java.io.IOException: Server returned HTTP response code: 401 for URL: https://algun_servidor…
at sun.net.www.protocol.http.HttpURLConnection.getInputStream (HttpURLConnection.java:1241)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream (HttpsURLConnectionImpl.java:234)
at ejemplo.Main.main(Main.java:57)
Java Result: 1

esta excepción se produce porque nos falta realizar la autenticación para ingresar al sitio.

Para conseguir autenticarnos utilizaremos la clase java.net.Authenticator, sobrescribiendo el método getPasswordAuthentication(). Este método debe devolver un objeto del tipo java.net.PasswordAuthentication seteado tanto con el usuario y clave.

Para realizar esto lo hacemos de la siguiente forma:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.net.URL;
import java.net.URLConnection;

public class Main {
   public static void main(String[] args)
    throws MalformedURLException, IOException {

      URL url = new URL("https://algun_servidor...");
      URLConnection con = url.openConnection();

      Authenticator au = new Authenticator() {
         @Override
         protected PasswordAuthentication
            getPasswordAuthentication() {
            return new PasswordAuthentication
               ("usuario", "clave".toCharArray());
         }
      };
      Authenticator.setDefault(au);

      BufferedReader in = new BufferedReader(
         new InputStreamReader(con.getInputStream()));

      String linea;
      while ((linea = in.readLine()) != null) {
         System.out.println(linea);
      }
   }
}

y listo, ahí podremos acceder.Hasta la próxima.

Más Info:



32 Responses to “Accediendo a un sitio HTTP/HTTPS desde Java”

  1. 1 eduardo

    El codigo muestra el codigo html solamente?? Yo lo que estoy buscando es como loguearme en una web desde java, se puede esto?

  2. 2 Jose

    Buenas, googleando he conseguido dar con esta web que me ha venido francamente bien, pero aún tengo una duda y me pregunto si podéis echarme una mano. ¿cómo puedo modificar el código para que me permita pasarle parámetros en modo post?.

    Un saludo y gracias

  3. 3 durban

    Muchas gracias

  4. 4 Nash

    Hola, a mi me marca ese error al tratar de ejecutar un Web Service que requiere certificado desde otra aplicación web. Si ejecuto el web service desde un cliente “stand alone” no me marca eso.Alguien puede decirme que puedo hacer???
    Gracias.

  5. 5 fdCarlos

    Hola Muchas Gracias Por el POST;

    unas preguntas:
    para implementar los metosdos POST and GET
    para el relleno de formularios
    la pagina no tiene autentificacion,
    solamente tengo que llenar dos campos y tiene un boton para enviar
    y despues me regresa un campo con un resultado el cual tengo que copiar a un archivo

    de ante mano muchas gracias

  6. 6 keyla

    su musica es muy buena y muy buscada por toda la jente

  7. 7 Peli

    Tengo una duda…

    me funciona el enviar una serie de parámetros, pero… ¿como puedo enviar un archivo a la jsp que tengo colgada en el servidor?

    Gracias de antemano!

  8. 8 Julio Ernesto

    Hola a todos, estoy intentando configurar Liferay 5.2.3 con el CAS Jasig 3.3.3, el CAS lo tengo bajo conexión HTTPS y cuando me logueo que redirecciono para el Liferay (bajo conexión HTTP) me está pasando lo el error unable to find valid certification path to requested target….. Alguien sabe como resolverlo????

  9. 9 olal_mol@hotmail.com

    Hola!!

    Justamente lo que necesitaba muchas GRACIAS

    SALUDOS DESDE GTO MEXICO

  10. gracias algo asi realice hace poco tiempo en donde un cliente no tenia navegador web y realice un cliente en java para tranferir archivos

  11. 11 Pitutos

    Hola che, me ayudo mucho tu post porque tengo cero experiencia con java y las clases relacionadas para la comunicación con protocolos web, ahora bien, tengo un problema, todo me anda perfecto salvo que cuando quiero hacer el getInputStream me devuelve un error 403 forbbiden. El servidor al que me conecto es https y tiene certificado, esto tiene algo que ver? tambien quiero saber como interactua el Authentificator con el resto del codigo… un abrazo!

  12. @Todos:
    Encontre como resolver el problema del certificado “googleando” un rato, les dejo el enlace:

    http://foros.pagosonline.net/index.php?showtopic=23&mode=threaded

    Y realmente funciona, espero les sea de utilidad.

  13. Aún no veo la relación entre https y autenticación con user/pass…

  14. 14 Juan Pablo

    Siempre hay locos como Fran, que tienen problemas y cuando los solucionan no se les escurre publicarlo. Mermes. Solo les intereza que los ayuden no mas.

  15. 15 Edgar

    fran. Yo tengo el mismo problema con una aplicación en Java y me gustaria saber como solucionarlo

    muchas gracias

  16. 16 override

    Excelente post! muchas gracias

  17. 17 Elias

    Estimados, tengo un problema: yo quiero acceder a dos paginas una tras otra por ejemplo, la primera pagina hace una autentificacion donde guarda variables de sessiones y la siguiente necesita de dicha session, el problema esta al momento de acceder a la segunda url, me imagino que ha de ser por que se pierde la session, el codigo es el mismo utilizado arriba. si alguien tiene idea por favor de ayudar

  18. 18 Miguel Ángel

    Hola Fran, cómo solucionaste los problemas con el certificado, a mí me está ocurriendo lo mismo que te ocurría a ti.

    Gracias.

  19. 19 fran

    lefunes, ya solucioné los problemas que tenía en el certificado, ahora me conecto bien al sitio https, desde alli ejecuto un jnlp que llama a un jar. Bien pues java vuelve a solicitarme el usuario y password. Tienes alguna idea de como puedo utilizar el mismo que ya he introducido?
    estoy porbando con Authenticator pero no hay manera.

    Gracias anticipadas.

    • 20 Gabriel

      Hola, yo tengo el mismo problema que tenías tu con el certificado, ¿cómo lo solucionaste? Gracias

  20. 21 Pepe

    Muchas gracias, justo lo que buscaba, ya solo me queda ver como le paso el certificado para validarme contra la pagina, pero muchas gracias, un post muy interesante

  21. Esta excepción se genera siempre es por el certificado del server. Proba apuntando el código a otro server (alguno público, como los de del.icio.us) para comprobar que este está correcto.

    Saludos

  22. 23 fran

    lefunes, gracias por contestar.
    He probado lo que explican en el link que comentas, veo lógico que java necesite conocer el certificado, pero me siguen lanzando el mismo error:

    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

    Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    ….

    Se te ocurre el por que?

    Gracias, saludos

  23. @fran fijate que las excepciones SSLHandshakeException generalmente se produce debido a problemas con el certificado generado desde el servidor. Esto te puede ayudar:

    http://www.java-samples.com/showtutorial.php?tutorialid=210

    Saludos

  24. 25 fran

    Genial, por fin encuentro información sobre java y https.
    He estado probando el código, por que estoy interesado en montar un sistema en java que se conecte a un servidor https y descargue ficheros desde alli.
    Probando elcódigo me dael siguiente error:


    Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:
    unable to find valid certification path to requested target
    ...

    Alguien sabe por que me pasa esto?
    O alguien sabe como montar un sistema parecido?

    Gracias,

    Saludos

  25. @Seraphinux muchas gracias.

    Con respecto a los feeds estoy viendo como resolver un problema con la publicación de los mismo por parte de wordpress.com, ya que si los dejo como Text Full los corta a los 500 caracteres. Espero resolverlo pronto

    Saludos

  26. Genial Post y Excelente blog.
    Oye una sugerencia/peticion… podrias poner los feed como Text Full, es que en el trabajo leo tu feed con Google y asi creen que estoy en el correo😀

  27. Muchas gracias Seba

    Nos estamos viendo.

  28. Excelente Post.

    Saludos

    Malvenido


  1. 1 Protocolo HTTP | Juan Minaya León
  2. 2 MachangaraSoft Corp (machangarasoft) 's status on Wednesday, 26-Aug-09 11:31:12 UTC - Identi.ca
  3. 3 Henry Molina (henrymolina) 's status on Wednesday, 26-Aug-09 11:31:04 UTC - Identi.ca

A %d blogueros les gusta esto: