2012-06-27 24 views
8

In realtà ho registrato una sessione nella mia WebView. Ma io uso anche httpclient per inviare e ottenere dati dal web. Ho visto su Internet che è impossibile ottenere il contenuto di una WebView, quindi ho dovuto usare il mio httpclient per ottenere i dati da un webservice.ANDROID: condivisione sessione tra Webview e httpclient

Il problema è che questo servizio Web utilizza sessioni ... e la mia sessione è nella mia WebView, quindi httpclient non ce l'ha e non posso accedere al contenuto del webservice.

Vedo molti post su questo problema ma non ho capito la soluzione.

Ecco quello che ho fatto sul mio onPageStarted:

CookieManager mgr = CookieManager.getInstance(); 
Log.i("URL", url); 
Log.i("Cookie",mgr.getCookie("mywebsite.com")); 
String cookie_string = mgr.getCookie("mywebsite.com"); 
if(cookie_string.length() > 1) {      
    Data.instance().getPref().edit().putString("cookie",cookie_string).commit(); 
} 

ho visto che ho questo tipo di cose, quindi spero che coloro che comprendono sessione di troppo: (tolgo il numero)

__utma=......(number)......; 

__utmc=number; 

__utmz=number.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); 

wt3_eid=%number%number; 

wt3_sid=%number 

Quindi non so cosa fare per impostare questo cookie nel mio httpclient. Provo che, senza successo:

HttpClient client = new DefaultHttpClient(); 
BasicCookieStore cookieStore = new BasicCookieStore(); 
String login_cookie_string = Data.instance().getPref().getString("cookie", ""); 
String[] cookie_parts = null; 
if(login_cookie_string.length()> 0) 
{ 

    //debug_view.setText(login_cookie_string); 
    Log.d("COOKIE", login_cookie_string); 
    cookie_parts = login_cookie_string.split(";"); 

    for(int t=0;t < cookie_parts.length;t++) 
    { 
     String[] cookieContent = cookie_parts[t].split("="); 
     Cookie login_cookie = new BasicClientCookie(cookieContent[0],cookieContent[1]); 
     ((BasicClientCookie) login_cookie).setDomain("mywebsite.com"); 
     cookieStore.addCookie(login_cookie); 
    } 

} 
((AbstractHttpClient) client).setCookieStore(cookieStore); 
+0

Instradare il traffico attraverso un proxy come WebScarab o Fiddler per scoprire le differenze rimanenti tra le richieste WebView e httpclient. – Robert

risposta

10

Seguire questo tuto:

http://metatroid.com/article/Android:%20handling%20web%20service%20authentication

====================== ========= Qui il contenuto della pagina web =====

Qualcosa che potresti trovare in Android è l'autenticazione web. La maggior parte dei siti Web rilascia un cookie per tenere traccia degli ID di sessione e mantenere l'accesso di un utente. Per mantenere questa autenticazione, è necessario mantenere i cookie sincronizzati tra le attività e tra i client http e le visualizzazioni Web.

Il metodo che ho terminato, che sembra funzionare abbastanza bene, era quello di creare una classe che estende l'applicazione, quindi definire un singolo HttpClient da utilizzare nel resto dell'applicazione. Questo codice è simile:

public class AppSettings extends Application { 
    private static final DefaultHttpClient client = createClient(); 

    @Override 
    public void onCreate(){ 
    } 

    static DefaultHttpClient getClient(){ 
      return client; 
    } 
    private static DefaultHttpClient createClient(){ 
      BasicHttpParams params = new BasicHttpParams(); 
      SchemeRegistry schemeRegistry = new SchemeRegistry(); 
      schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
      final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory(); 
      schemeRegistry.register(new Scheme("https", sslSocketFactory, 443)); 
      ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); 
      DefaultHttpClient httpclient = new DefaultHttpClient(cm, params); 
      httpclient.getCookieStore().getCookies(); 
      return httpclient; 
    } 

Questa classe crea anche un HttpClient che è adatto per AsyncTasks e rendendo più richieste HTTP simultanee. Usando ThreadSafeClientConnManager per ClientConnectionManager eseguiamo le richieste http all'interno di AsyncTasks senza causare una chiusura forzata quando premi il pulsante Indietro e inizi un secondo o terzo.

Viene inoltre creato un unico archivio di cookie predefinito a cui è possibile accedere in tutte le attività. Lo useresti nelle altre tue attività chiamando il metodo getClient().

Per esempio

public class SomeActivity extends Activity { 
     static DefaultHttpClient mClient = AppSettings.getClient(); 
     ... 
     try { 

      HttpGet httpget = new HttpGet('URL'); 
      HttpResponse response; 
      response = mClient.execute(httpget); 
      ... 
     } 
     ... 
    } 

Se ritenete necessario usare un WebView e ha bisogno di accedere e utilizzare gli stessi cookie come client. È possibile sincronizzare negozio del cliente biscotto utilizzando CookieManager: (in modalità onPageStarted)

DefaultHttpClient mClient = AppSettings.getClient(); 


Cookie sessionInfo; 
List<Cookie> cookies = mClient.getCookieStore().getCookies(); 

if (! cookies.isEmpty()){ 
     CookieSyncManager.createInstance(getApplicationContext()); 
     CookieManager cookieManager = CookieManager.getInstance(); 

     for(Cookie cookie : cookies){ 
       sessionInfo = cookie; 
       String cookieString = sessionInfo.getName() + "=" + sessionInfo.getValue() + "; domain=" + sessionInfo.getDomain(); 
       cookieManager.setCookie("example.com", cookieString); 
       CookieSyncManager.getInstance().sync(); 
     } 
} 

Sarà necessario cambiare example.com con il dominio corretto.

+0

Il collegamento è rotto – Skynet

15

Quindi, questo è quello che ho fatto e ha funzionato per me -

HttpRequestBase request = new HttpGet(uri); 
request.addHeader("Cookie", getCookieFromAppCookieManager(uri.toString())); 

Ora l'implmentation per la getCookieFromAppCookieManager è il seguente -
Il metodo ottiene i cookie per un determinato URL dall'applicazione CookieManager. L'applicazione CookieManager gestisce i cookie utilizzati dalle istanze di WebView di un'applicazione.

@param url the URL for which the cookies are requested 
@return value the cookies as a string, using the format of the 'Cookie' HTTP request header 
@throws MalformedURLException 


public static String getCookieFromAppCookieManager(String url) throws MalformedURLException { 
    CookieManager cookieManager = CookieManager.getInstance(); 
    if (cookieManager == null) 
     return null; 
    String rawCookieHeader = null; 
    URL parsedURL = new URL(url); 

    // Extract Set-Cookie header value from Android app CookieManager for this URL 
    rawCookieHeader = cookieManager.getCookie(parsedURL.getHost()); 
    if (rawCookieHeader == null) 
     return null; 
    return rawCookieHeader; 
} 
+0

grazie per la condivisione – Dahevos

+0

Non funziona per me .. –

+0

funziona bene per me se tutto ciò che si desidera è condividere un cookie di visualizzazione Web con codice nativo (ad esempio httpclient) – 2cupsOfTech

Problemi correlati