2012-06-27 30 views
8

Tôi thực sự đã đăng nhập phiên trong WebView của mình. Nhưng tôi cũng sử dụng httpclient để gửi và nhận dữ liệu từ web. Tôi thấy trên internet rằng nó không thể có được nội dung của một WebView, vì vậy tôi cần sử dụng httpclient của tôi để lấy dữ liệu từ một webservice.ANDROID: Chia sẻ phiên giữa Webview và httpclient

Vấn đề là dịch vụ web này sử dụng phiên ... và phiên của tôi nằm trong WebView của tôi, vì vậy httpclient không có nó và tôi không thể truy cập nội dung của webservice.

Tôi thấy nhiều bài đăng về vấn đề này nhưng tôi không hiểu giải pháp.

Dưới đây là những gì tôi đã làm trên onPageStarted tôi:

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

tôi thấy rằng tôi có loại của sự vật, vì vậy tôi hy vọng những người bao gồm phiên quá: (i loại bỏ các số)

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

__utmc=number; 

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

wt3_eid=%number%number; 

wt3_sid=%number 

Sau đó, tôi không biết phải làm gì để đặt cookie này trong httpclient của tôi. Tôi cố gắng đó, nhưng không thành công:

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

Định tuyến lưu lượng truy cập thông qua proxy như WebScarab hoặc Fiddler để tìm ra sự khác biệt còn lại giữa yêu cầu WebView và httpclient. – Robert

Trả lời

10

theo tuto này:

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

====================== ========= Tại đây, nội dung của trang web =====

Điều bạn có thể thấy mình đang làm trong Android là xác thực web. Hầu hết các trang web phát hành cookie để theo dõi ID phiên và giữ người dùng đăng nhập. Để duy trì xác thực này, bạn sẽ cần phải giữ cookie được đồng bộ hóa giữa các hoạt động và giữa khách hàng http và xem trên web.

Phương pháp tôi đã kết thúc, dường như hoạt động tốt, là tạo một lớp mở rộng Ứng dụng, sau đó xác định một HttpClient đơn lẻ được sử dụng trong suốt phần còn lại của Ứng dụng. Mã đó trông giống như:

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

Lớp này cũng tạo ra HttpClient phù hợp với AsyncTask và thực hiện nhiều yêu cầu http đồng thời. Sử dụng ThreadSafeClientConnManager cho ClientConnectionManager cho phép bạn chạy các yêu cầu http bên trong AsyncTasks mà không gây ra một lực đóng khi bạn nhấn nút quay lại và bắt đầu một giây, hoặc thứ ba.

Nó cũng tạo một cửa hàng cookie mặc định duy nhất có thể truy cập được trong tất cả các hoạt động của bạn. Bạn sẽ sử dụng nó trong các hoạt động khác của bạn bằng cách gọi phương thức getClient().

Ví dụ

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

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

Nếu bạn tìm thấy nó cần thiết để sử dụng một webview và cần nó để truy cập và sử dụng các tập tin cookie giống như khách hàng của bạn. Bạn có thể đồng bộ hóa kho lưu trữ cookie của khách hàng bằng CookieManager: (trong phương thức 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(); 
     } 
} 

Bạn cần chuyển example.com với tên miền chính xác.

+0

Liên kết bị hỏng – Skynet

15

Vì vậy, đây là những gì tôi đã làm và nó làm việc cho tôi -

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

Bây giờ implmentation cho getCookieFromAppCookieManager là như sau -
Method lấy cookie cho một URL được từ việc áp dụng CookieManager. Ứng dụng CookieManager quản lý các cookie được sử dụng bởi các phiên bản WebView của ứng dụng.

@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

cảm ơn bạn đã chia sẻ – Dahevos

+0

Không hoạt động cho tôi .. –

+0

hoạt động tốt cho tôi nếu tất cả những gì bạn muốn là chia sẻ cookie trên webview với mã gốc (ví dụ: httpclient) – 2cupsOfTech

Các vấn đề liên quan