2011-10-11 26 views
5
public boolean isGood(String path) 
{ 
    if (p != path) 
    { 
     good = false; 
    } 

    if (good) 
    { 
     try 
     { 
      Connection connection = Jsoup.connect(path); 
      Map<String, String> cookys = Jsoup.connect(path).response().cookies(); 

      if (cookys != cookies) 
       cookies = cookys; 

      for (Entry<String, String> cookie : cookies.entrySet()) 
      { 
       connection.cookie(cookie.getKey(), cookie.getValue()); 
      } 

      Doc = connection.get(); 
      good = true; 
     } 
     catch (Exception e) 
     { 
      rstring = e.getMessage().toString(); 
      good = false; 
     } 
    } 
    else 
    { 
     try 
     { 
      Response response = Jsoup.connect(path).execute(); 
      cookies = response.cookies(); 
      Doc = response.parse(); 
      good = true; 
     } 
     catch (Exception e) 
     { 
      rstring = e.getMessage().toString(); 
      good = false; 
     } 
    }  
    return good; 
} 

Este método no es correcto. Lo que estoy tratando de descubrir es una forma de no saber qué cookies existirán, ser capaz de manejar cambios de cookies y mantener sesiones.cómo mantener cookies variables y sesiones con jsoup?

Estoy escribiendo una aplicación para mi foro de máquinas simples, y cambia su configuración de cookies cuando hace clic para un comportamiento personalizado.

Pero si la aplicación funciona bien para mi sitio, iba a publicar una versión para que otros la utilicen para otros foros.

Sé que voy en la dirección correcta, pero la lógica es como patearme el trasero.

Cualquier consejo sería muy apreciado.

+0

Además de los comentarios de BalusC, es poco probable que 'p! = path' es lo que realmente quieres decir, aunque es * posible *. –

Respuesta

12

Este código es muy confuso. El flujo es ilógico y el manejo de excepciones es malo. Las comparaciones de referencia de objeto como if (p != path) y if (cookys != cookies) no tienen sentido. Para comparar el contenido del objeto , debe utilizar el método equals().

Hasta el punto, entiendo que desea mantener las cookies en una serie de solicitudes de Jsoup posteriores en el mismo dominio. En ese caso, es necesario básicamente adhieren el siguiente flujo:

Map<String, String> cookies = new HashMap<String, String>(); 

// First request. 
Connection connection1 = Jsoup.connect(url1); 
for (Entry<String, String> cookie : cookies.entrySet()) { 
    connection1.cookie(cookie.getKey(), cookie.getValue()); 
} 
Response response1 = connection1.execute(); 
cookies.putAll(response1.cookies()); 
Document document1 = response1.parse(); 
// ... 

// Second request. 
Connection connection2 = Jsoup.connect(url2); 
for (Entry<String, String> cookie : cookies.entrySet()) { 
    connection2.cookie(cookie.getKey(), cookie.getValue()); 
} 
Response response2 = connection2.execute(); 
cookies.putAll(response2.cookies()); 
Document document2 = response2.parse(); 
// ... 

// Third request. 
Connection connection3 = Jsoup.connect(url3); 
for (Entry<String, String> cookie : cookies.entrySet()) { 
    connection3.cookie(cookie.getKey(), cookie.getValue()); 
} 
Response response3 = connection3.execute(); 
cookies.putAll(response3.cookies()); 
Document document3 = response3.parse(); 
// ... 

// Etc. 

Esto puede ser reprogramado con el siguiente método:

private Map<String, String> cookies = new HashMap<String, String>(); 

public Document get(url) throws IOException { 
    Connection connection = Jsoup.connect(url); 
    for (Entry<String, String> cookie : cookies.entrySet()) { 
     connection.cookie(cookie.getKey(), cookie.getValue()); 
    } 
    Response response = connection.execute(); 
    cookies.putAll(response.cookies()); 
    return response.parse(); 
} 

que puede ser utilizado como

YourJsoupWrapper jsoupWrapper = new YourJsoupWrapper(); 

Document document1 = jsoupWrapper.get(url1); 
// ... 

Document document2 = jsoupWrapper.get(url2); 
// ... 

Document document3 = jsoupWrapper.get(url3); 
// ... 

Tenga en cuenta que el próximo Jsoup 1.6.2 vendrá con un nuevo método Connection#cookies(Map) que debería hacer que el bucle for siempre superfluo.

+0

te agradezco mucho. Busqué y busqué un ejemplo de la forma correcta de hacerlo. De esta manera es definitivamente mejor que la forma en que estaba intentando. lol – texasman1979

+0

¡Alguien del futuro! por alguna razón, encontré que JSoup es muy conveniente. Solo mis dos centavos son que en la biblioteca actual de JSoup hay un método llamado cookies (Map cookies) que hace la adición de los pares clave/valor. Entonces el foreach anterior puede ser reemplazado por: connection.cookies (cookies) –

+0

puedes hacer connection.cookies (cookies) en lugar del bucle for – caub

1

1 de BalusC

me cambiaron algunos en su código y funciona para mí, para que tenga cookie de sitio y sólo de obtener el documento

public Document get(String url) throws IOException { 
    Connection connection = Jsoup.connect(url).userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); 
    Connection.Response response = connection.execute(); 
    connection.cookies(response.cookies()); 
    return connection.get(); 
} 
Cuestiones relacionadas