2011-10-11 16 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; 
} 

Questo metodo non è corretto. Quello che sto cercando di capire è un modo per non sapere quali cookie esisteranno, essere in grado di gestire i cambiamenti dei cookie e mantenere le sessioni.come mantenere i cookie e le sessioni variabili con jsoup?

Sto scrivendo un'app per il mio forum di macchine semplici, e cambia la sua configurazione dei cookie mentre fai clic su per alcuni comportamenti personalizzati.

Ma se l'app funziona bene per il mio sito, stavo per pubblicare una versione che altri potrebbero usare per altri forum.

So che sto andando nella giusta direzione, ma la logica è un po 'come prendermi a calci nel sedere.

Qualsiasi consiglio sarebbe molto apprezzato.

+0

Oltre ai commenti di BalusC, è improbabile che 'p! = path' thing è ciò che intendi veramente, anche se è * possibile *. –

risposta

12

Questo codice è molto confuso. Il flusso è illogico e la gestione delle eccezioni è negativa. I confronti di riferimento oggetto come if (p != path) e if (cookys != cookies) non hanno alcun senso. Per confrontare il contenuto dell'oggetto , è necessario utilizzare il metodo equals().

Al punto, capisco che si desidera mantenere i cookie in un gruppo di successive richieste Jsoup sullo stesso dominio. In tal caso, è necessario fondamentalmente aderire il seguente flusso:

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. 

Questo può essere riscritta per il seguente metodo:

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

che può essere utilizzato come

YourJsoupWrapper jsoupWrapper = new YourJsoupWrapper(); 

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

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

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

Nota che il prossimo Jsoup 1.6.2 verrà fornito con un nuovo metodo Connection#cookies(Map) che dovrebbe rendere ogni volta il ciclo for superfluo.

+0

ti ringrazio molto. ho cercato e cercato un esempio del modo giusto per farlo. in questo modo è decisamente meglio del modo in cui stavo tentando. lol – texasman1979

+0

Qualcuno dal futuro! per qualche motivo ho trovato JSoup molto conveniente. Solo i miei due centesimi sono che nella libreria JSoup corrente c'è un metodo chiamato cookie (Map cookies) che fa l'aggiunta delle coppie chiave/valore. Quindi il foreach di cui sopra può essere sostituito per: connection.cookies (cookies) –

+0

puoi fare connection.cookies (cookies) invece del ciclo for – caub

1

+1 per BalusC

ho cambiato un po 'nel codice e funziona per me, in modo da ottenere cookie dal sito e solo di ottenere 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(); 
} 
Problemi correlati