2013-12-18 73 views
0

我正嘗試使用HttpPost登錄網站。我的目標是登錄並獲取網站提供的必要cookies。到目前爲止,我在「登錄」方面取得了成功,但問題仍然存在於重定向中。登錄後,我收到來自服務器的成功消息,但實際上,網站會重定向到不同的網址,並提供會話所需的Cookie。我已經檢查過該網站如何與Chrome開發者工具「協同工作」,並且我擁有必要的參數以便發佈帖子。登錄到使用JAVA/Android的網站(重定向問題)

我的客戶目前沒有收到所需的cookies,因爲它沒有跟進重定向。基本上我想知道下一步該做什麼。如何在登錄後跟進服務器重定向,以獲取所需的cookie?我應該使用什麼類/方法?我閱讀了htmlUnit,但我想避免它,因爲庫/數據量很大,我的應用程序只有0.5mb。

我現在正在做(簡體):

連接 - >登錄(httpPost) - >成功(200) - >我只接收一個 餅乾(這心不是一個我需要)。

我覺得我應該做的事情(簡體):

連接 - >登錄 - >成功(200) - >使用重定向跟進 - > 獲取餅乾(共有5 )

謝謝你的時間,這裏的代碼。我目前使用的cookie是不正確的。

DefaultHttpClient httpclient = new DefaultHttpClient(); 
      HttpResponse response = null; 

      Log.d("LOGGING" , "Posting..."); 
      HttpPost httpost = new HttpPost(url); 
      List <NameValuePair> nvps = new ArrayList <NameValuePair>(); 
      nvps.add(new BasicNameValuePair("user", "myUser")); 
      nvps.add(new BasicNameValuePair("passwrd", "myPw")); 
      nvps.add(new BasicNameValuePair("openid_identifier", "")); 
      nvps.add(new BasicNameValuePair("cookielength", "-1")); 
      nvps.add(new BasicNameValuePair("hash_passwrd", "")); 

      try { 
       httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); 
      } catch (UnsupportedEncodingException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 

      try { 
       Log.d("LOGGING" , "Getting login response..."); 
       response = httpclient.execute(httpost); 
      } catch (ClientProtocolException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      HttpEntity entity = response.getEntity(); 
      Log.d("LOGGING" , "Login form getStatus: " + response.getStatusLine()); 

      List<Cookie> cookies = httpclient.getCookieStore().getCookies(); 
      Log.d("LOGGING" , "Cookie: " + cookies.toString()); 

      String SESSION_NAME = "PHPSESSID"; 
      String[] sessionValue = cookies.toString().split("value: "); 
      String[] sessionValue1 = sessionValue[1].split("]"); 
      String realSessionValue = sessionValue1[0].toString(); 
      Log.d("LOGGING", "SESSION NAME:" + realSessionValue); 

      /* 
      Connection.Response loginForm = Jsoup.connect(url) 
        .method(Connection.Method.GET) 
        .referrer(referrer) 
        .execute(); 

      Document login = Jsoup.connect(url) 
        .data("user", "myUser") 
        .data("passwrd", "myPw") 
        .data("cookielength", "1440") 
        .data("openid_identifier", "") 
        .data("hash_password", "") 
        .referrer(referrer) 
        .cookie(SESSION_NAME, realSessionValue) 
        .post(); 
      */ 

      doc = Jsoup.connect(url) 
        .cookie(SESSION_NAME, realSessionValue) 
        .get(); 

      //String body = doc.select("body").html(); 
      //Log.d("LOGGING", "Body: " + body.toString()); 

      //Check login 
      Elements bodies = doc.select("body").first().select("div#main-container-radio").first().select("div#radiorow").first().select("div.bghue").first().select("form#shoutbox-form-r"); 
      Log.d("LOGGING", "Login status: " + bodies.toString()); 
+0

有沒有其他方法可以做到這一點?你有任何控制網站?對不起,這不是最有效的答覆,但它確實看起來像這是一個艱難的做事方式。 – cbrulak

+0

謝謝你的迴應。我對網站沒有任何控制權,並且很可能無法收到任何文檔。我正在嘗試爲Android(正在工作)爲他們的流創建一個非官方的廣播客戶端,現在我正在嘗試添加使用他們的Shoutbox的功能(必須在註釋之前登錄)。 – user2970008

+0

我認爲,使用HttpClient,你必須設置默認的重定向策略。有一個例子在這篇文章中:http://stackoverflow.com/questions/3658721/httpclient-4-error-302-how-to-redirect – CodeChimp

回答

0

謝謝大家。這是我自己的代碼中的問題,我錯誤地使用了錯誤的URL,因爲它們有3個不同的登錄名。否則它運行得很好。