2011-05-05 113 views
8

在我的Android應用程序中,我使用Web視圖來訪問服務器提供的一些Web映射數據。服務器需要一些基於HTTP表單的身份驗證才能訪問這些數據。由於該網站沒有移動版本,顯示登錄頁面(或任何其他頁面)看起來很糟糕。不幸的是,現場幾乎成爲我手中,所以我已經想到了以下做法:以編程方式從WebView登錄

  • 使用原生用戶界面來收集用戶名和密碼
  • 想到了一個HTTP POST發送這些信息到服務器
  • 後收到響應獲得服務器發送
  • 設置的Cookie到web視圖
  • 嘗試最後訪問所需數據的餅乾

現在我只是想通過登錄階段。

這是一個可行的解決方案,或只是明顯錯誤,我應該嘗試別的?

爲了完整性我後下

A.認證部分

private String authenticate() throws Exception 
    { 
     // Create a new HttpClient and Post Header 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost("http://mySite/login_form"); 

      HttpResponse response = null; 
      BufferedReader in = null; 
      String resultContent = null; 

      try 
      { 
       // Add data 
       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
       nameValuePairs.add(new BasicNameValuePair("came_from", "")); 
       nameValuePairs.add(new BasicNameValuePair("form.submitted", "1")); 
       nameValuePairs.add(new BasicNameValuePair("js_enabled", "0")); 
       nameValuePairs.add(new BasicNameValuePair("cookies_enabled", "")); 
       nameValuePairs.add(new BasicNameValuePair("login_name", "")); 
       nameValuePairs.add(new BasicNameValuePair("pwd_empty", "0")); 
       nameValuePairs.add(new BasicNameValuePair("name", "username")); 
       nameValuePairs.add(new BasicNameValuePair("password", "password")); 

       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

       // 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); 
       // Execute HTTP Post Request 
       response = httpclient.execute(httppost,localContext); 

       in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
       StringBuffer sb = new StringBuffer(""); 
       String line = ""; 
       String NL = System.getProperty("line.separator"); 
       while ((line = in.readLine()) != null) 
       { 
       sb.append(line + NL); 
       } 
       in.close(); 
       resultContent = sb.toString(); 
       Log.i("mytag","result :"+resultContent); 

       cookies = new java.util.ArrayList(); 
       cookies = cookieStore.getCookies(); 

      } 
      catch (ClientProtocolException e) 
      { 
       Log.i("mytag","Client protocol exception"); 
      } 
      catch (IOException e) 
      { 
       Log.i("mytag","IOException"); 
      } 
      catch(Exception e) 
      { 
       Log.i("mytag","Exception"); 
       Log.i("mytag",e.toString()); 
      } 


     return resultContent; 

    } 

B.設置cookies和加載所需的頁面

private void init() 
{ 
      CookieSyncManager.createInstance(this); 
      CookieManager cookieMan= CookieManager.getInstance(); 
      cookieMan.setAcceptCookie(true); 
      cookies = StartupActivity.listAfter; 

      if(cookies != null) 
      { 
       for (int i = 0; i<cookies.size(); i++) 
       { 
        Cookie cookie = cookies.get(i); 
        cookieMan.setCookie("cookie.getDomain()",cookie.getValue()); 
       } 
      } 
      CookieSyncManager.getInstance().sync(); 

      webView = (WebView)findViewById(R.id.web_view); 
      webView.getSettings().setJavaScriptEnabled(true); 
      webView.getSettings().setBuiltInZoomControls(true); 
      webView.setWebViewClient(new HelloWebViewClient()); 

} 

    protected void onResume() 
    { 
      super.onResume();  

      // test if the we logged in 
      webView.loadUrl("mySite/myDesiredFeature"); 

    } 

加載該頁面的結果代碼是顯示的登錄頁面表格

+1

我可能會做同樣的事情 – 2011-05-05 13:25:21

回答

1

1)先嚐試使HttpGet請求,獲取cookie,然後執行HttpPost。我認爲這樣你不應該手動添加cookie。 使用一個HttpClient來做到這一點。

2)代替

  in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
      StringBuffer sb = new StringBuffer(""); 
      String line = ""; 
      String NL = System.getProperty("line.separator"); 
      while ((line = in.readLine()) != null) 
      { 
      sb.append(line + NL); 
      } 
      in.close(); 
      resultContent = sb.toString(); 

使用 EntityUtils.toString(response.getEntity())。