2010-08-27 9 views
40

Sto tentando di accedere a un sito e mantenere quella sessione/cookie in modo che il server riconosca il mio login, ma sto cercando di capire un modo per estrarre il cookie dalla risposta e impostare una richiesta per mantenere il mio login . Mi chiedo se dovrei andare a prendere l'intestazione "Set-Cookie" o utilizzare un CookieStore. Qualsiasi aiuto è molto apprezzato. Ecco il mio codice che ho, con commenti dove penso che i metodi getHeader/getCookie sarebbero andati.Come si gestiscono i cookie con HttpClient in Android e/o Java?

public class Http 
{ 
DefaultHttpClient client = new DefaultHttpClient(); 
HttpGet request; 
HttpEntity entity; 
HttpResponse response; 
HttpPost post; 
CookieStore cookieStore = new BasicCookieStore(); 
HttpContext localContext = new BasicHttpContext(); 

public static void setContext() 
{ 
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 
} 

public static void getPage(String url) throws Exception 
{ 
    request = new HttpGet(url); 
    response = client.execute(request, localContext); 
    PARSER.preParse(url, response); 
} 

public static HttpResponse postPage(List<NameValuePair> params, String host, String action) throws Exception 
{ 
    post = new HttpPost(host + action); 
    post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); 

    response = client.execute(post, localContext); 

    entity = response.getEntity(); 
    if(entity != null) 
    { 
     entity.consumeContent(); 
    } 

    return response; 
} 


public void destoyHttp() 
{ 
    client.getConnectionManager().shutdown(); 
} 
} 

Nella speranza di comprendere meglio gli altri la mia confusione sono l'aggiunta di codice che so funziona e mantiene una sessione, ma quando ho provato a spostare il codice in mia applicazione effettiva si è rotto da qualche parte lungo la linea.

public class HttpClientTest extends Activity{ 

DefaultHttpClient client = new DefaultHttpClient(); 
HttpGet request; 
HttpEntity entity; 
List<Cookie> cookies; 
HttpResponse response; 
HttpPost post; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    try { 
     getRequest(); 
    } catch (Exception e) { 
     Log.d("My Activity", "Failed"); 
     e.printStackTrace(); 
    } 
} 

public void getRequest() throws Exception 
{ 
    final String TAG = "MyActivity"; 
    request = new HttpGet("http://gc.gamestotal.com/i.cfm?p=login&se=4"); 
    response = client.execute(request); 

    String action = "i.cfm?&1028&p=login&se=4"; 
    String yourServer = "http://gc.gamestotal.com/"; 
    post = new HttpPost(yourServer + action); 

    List<NameValuePair> params = new ArrayList<NameValuePair>(); 
    params.add(new BasicNameValuePair("nic", "myusername")); 
    params.add(new BasicNameValuePair("password", "mypassword")); 
    params.add(new BasicNameValuePair("server", "4")); 

    post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); 


    response = client.execute(post); 
    entity = response.getEntity(); 

    if(entity != null){ 
     entity.consumeContent(); 
    } 

    request = new HttpGet("http://gc.gamestotal.com/i.cfm?f=com_empire&cm=3"); 

    response = client.execute(request); 

    if(entity != null) 
    { 
     entity.consumeContent(); 
    }  

} 

} 

So per certo che funziona, e si può vedere che in questo codice I consumeContent(), ma aggiungendo che all'inizio Codice non sembrava di fare la differenza così ho lasciato fuori. Qualche idea?

Modifica: Non riesco ancora a far funzionare il codice per mantenere attiva una sessione. Sto pubblicando i cookie dal mio codice corrente, insieme ai cookie del secondo codice che funziona. Forse qualcuno noterà un problema, io certamente no.

08-31 06:53:50.318: VERBOSE/SFGC(496): - [version: 0][name: CFID][value: 26651316][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:53:50.329: VERBOSE/SFGC(496): - [version: 0][name: CFTOKEN][value: 96917381][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:53:50.329: VERBOSE/SFGC(496): - [version: 0][name: CFCLIENT_SFGC_106Y][value: CFTOKEN2%3D735125416524430%23COUNTRY%3D56%23DOWNLOADFLAG%3D0%23OCHAT%3D1%23PM%5FDATE%3D%7Bts+%272010%2D08%2D31+14%3A53%3A45%27%7D%23REGION%3D3%23SCREEN%3D800%23S%5FGC%5FIMAGELOC%3Di%2Fw%2F%23TIMEZONE%3D%2D600%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:53:50.339: VERBOSE/SFGC(496): - [version: 0][name: CFGLOBALS][value: HITCOUNT%3D2%23LASTVISIT%3D%7Bts+%272010%2D08%2D31+14%3A53%3A45%27%7D%23TIMECREATED%3D%7Bts+%272010%2D08%2D31+14%3A53%3A39%27%7D%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 

08-31 06:53:51.938: VERBOSE/SFGC(496): - [version: 0][name: CFID][value: 26651316][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:53:51.938: VERBOSE/SFGC(496): - [version: 0][name: CFTOKEN][value: 96917381][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:53:51.938: VERBOSE/SFGC(496): - [version: 0][name: CFCLIENT_SFGC_106Y][value: CFTOKEN2%3D735125416524430%23COUNTRY%3D56%23DOWNLOADFLAG%3D0%23OCHAT%3D1%23PM%5FDATE%3D%7Bts+%272010%2D08%2D31+14%3A53%3A45%27%7D%23REGION%3D3%23SCREEN%3D800%23S%5FGC%5FIMAGELOC%3Di%2Fw%2F%23TIMEZONE%3D%2D600%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:53:51.948: VERBOSE/SFGC(496): - [version: 0][name: CFGLOBALS][value: HITCOUNT%3D3%23LASTVISIT%3D%7Bts+%272010%2D08%2D31+14%3A53%3A46%27%7D%23TIMECREATED%3D%7Bts+%272010%2D08%2D31+14%3A53%3A39%27%7D%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 


08-31 06:52:41.628: DEBUG/MyActivity(469): - [version: 0][name: CFID][value: 26651274][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:52:41.638: DEBUG/MyActivity(469): - [version: 0][name: CFTOKEN][value: 58361320][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:52:41.638: DEBUG/MyActivity(469): - [version: 0][name: CFCLIENT_SFGC_106Y][value: CFTOKEN2%3D735125815099420%23COUNTRY%3D56%23DOWNLOADFLAG%3D0%23OCHAT%3D1%23PM%5FDATE%3D%7Bts+%272010%2D08%2D31+14%3A52%3A36%27%7D%23REGION%3D3%23SCREEN%3D800%23S%5FGC%5FIMAGELOC%3Di%2Fw%2F%23TIMEZONE%3D%2D600%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:52:41.648: DEBUG/MyActivity(469): - [version: 0][name: CFGLOBALS][value: HITCOUNT%3D2%23LASTVISIT%3D%7Bts+%272010%2D08%2D31+14%3A52%3A36%27%7D%23TIMECREATED%3D%7Bts+%272010%2D08%2D31+14%3A52%3A33%27%7D%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 

08-31 06:52:44.138: DEBUG/MyActivity(469): - [version: 0][name: CFID][value: 26651274][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:52:44.138: DEBUG/MyActivity(469): - [version: 0][name: CFTOKEN][value: 58361320][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:52:44.138: DEBUG/MyActivity(469): - [version: 0][name: CFCLIENT_SFGC_106Y][value: CFTOKEN2%3D735125815099420%23COUNTRY%3D56%23DOWNLOADFLAG%3D0%23OCHAT%3D1%23PM%5FDATE%3D%7Bts+%272010%2D08%2D31+14%3A52%3A36%27%7D%23REGION%3D3%23SCREEN%3D800%23S%5FGC%5FIMAGELOC%3Di%2Fw%2F%23TIMEZONE%3D%2D600%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:52:44.138: DEBUG/MyActivity(469): - [version: 0][name: CFGLOBALS][value: HITCOUNT%3D4%23LASTVISIT%3D%7Bts+%272010%2D08%2D31+14%3A52%3A38%27%7D%23TIMECREATED%3D%7Bts+%272010%2D08%2D31+14%3A52%3A33%27%7D%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 

risposta

3

sono stato in grado di ottenere il mio codice di lavoro (potrei lavorare su di essa in un secondo momento), ma ho trovato codice utile qui Android project using httpclient --> http.client (apache), post/get method e sto usando la classe costruita da Charlie Collins, che è simile al codice Http nell'esempio ZXing Android. Potrei eventualmente passare al codice ZXing.

38

È necessario utilizzare HttpContext. Imposta l'archivio dei cookie sul contesto e passa il contesto lungo con HttpGet/HttpPost nel metodo di esecuzione. Spero che questo dovrebbe aiutare.

vedi esempio: il codice completo è disponibile here

// Create a local instance of cookie store 
    CookieStore cookieStore = new BasicCookieStore(); 

    // Create local HTTP context 
    HttpContext localContext = new BasicHttpContext(); 
    // Bind custom cookie store to the local context 
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

    HttpGet httpget = new HttpGet("http://www.google.com/"); 

    System.out.println("executing request " + httpget.getURI()); 

    // Pass local context as a parameter 
    HttpResponse response = httpclient.execute(httpget, localContext); 
+0

Ok, come farei per ottenere l'intestazione? Lo prendo dalla risposta, ad esempio, response.getHeader ("Set-Cookie")? Perché ho provato a fare qualcosa di simile ma c'è solo un getHeaders(); metodo che presumo restituisce un array? Dovrei cercarlo di nuovo. –

+1

Ok, sono riuscito a utilizzare l'oggetto Header [] e ho impostato correttamente le intestazioni tra cui l'intestazione Cookie ma non sembra che risolva il problema. Ho modificato la mia domanda con il codice che fa il lavoro che ho fatto, ma per qualche motivo quando l'ho spostato sulla mia applicazione effettiva si è rotto. FYI il codice di lavoro non fa nulla con le intestazioni, funziona solo? lol –

+0

Ok;) Sono riuscito a trovare qualcosa che vedo mancante dal codice e aggiornato (piuttosto cambiato) la mia risposta. – YoK

0

per me non ha funzionato, fino a quando ho reso sia HttpContext che CookieStore statico, per rimanere per tutte le richieste.

Problemi correlati