2012-06-27 37 views
8

之間共享會話我居然在我的WebView一個登錄會話。 但我也使用httpclient發送並從網上獲取數據。我在互聯網上看到,無法獲取WebView的內容,所以我需要使用我的httpclient從web服務獲取數據。ANDROID:網頁視圖和HttpClient的

的問題是,這個Web服務使用會話......而我會在我的WebView,所以HttpClient的沒有它,我無法訪問web服務的內容。

我看到這個問題很多帖子,但我不明白的解決方案。

這裏是我做了我的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(); 
} 

我看到了,我有這樣的事情,所以我希望那些包括會議太: (我刪除的數量)

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

__utmc=number; 

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

wt3_eid=%number%number; 

wt3_sid=%number 

然後我不知道該怎麼做才能在我的httpclient中設置這個cookie。我嘗試,但沒有成功:

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

路線通過像WebScarab或提琴手的代理找出的WebView和HttpClient的請求之間尚存分歧的流量。 – Robert

回答

10

關注這個政黨成員:

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

====================== =========這裏的網頁內容=====

有些事情,你可能會發現自己在Android的做的是Web認證。 大多數網站發出一個cookie來跟蹤會話ID並保持用戶登錄。爲了保持這種身份驗證,您需要保持cookie在活動之間以及http客戶端和webviews之間同步。

我落得這樣做,這似乎工作不夠好方法,是創建一個擴展應用程序類,然後定義一個HttpClient的整個應用程序的其他部分使用。該代碼看起來像:

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

此類還創建了一個HttpClient的是適合AsyncTasks,使多個同時HTTP請求。對ClientConnectionManager使用ThreadSafeClientConnManager,讓您在AsyncTasks中運行http請求,而不必在按下後退按鈕並開始第二次或第三次時導致強制關閉。

,還創建了可在所有的活動來訪問一個默認的cookie存儲。您可以通過調用getClient()方法在其他活動中使用它。

例如

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

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

如果你覺得有必要使用網頁視圖,並需要它來訪問並使用相同的餅乾爲您的客戶端。您可以使用同步的CookieManager客戶端的cookie存儲區:(在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(); 
     } 
} 

你需要切換example.com與正確的域。

+0

鏈接被破壞 – Skynet

15

所以,這是我做的,它爲我工作 -

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

現在的getCookieFromAppCookieManager的implmentation如下 -
的方法獲取餅乾從應用程序CookieManager一個給定的URL。應用程序CookieManager管理應用程序的WebView實例使用的Cookie。

@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

感謝分享 – Dahevos

+0

不適用於我.. –

+0

如果你想要的是與本地代碼(即httpclient)共享webview cookie – 2cupsOfTech