2013-03-04 105 views
1

我遇到了一個問題 - 當您已經登錄並嘗試訪問另一個受保護頁面時,返回401錯誤信息。對於我來說,這個問題的神祕性是,如果通過Firefox RestCLient或通過iOS應用程序進行檢查,但是無法通過Chrome Advanced Rest Client和Android應用程序訪問,我可以在登錄後訪問另一個受保護的頁面。但是,內容類型和其他必要的參數在Web工具和應用程序中都是相同的。我試圖用編碼登錄設置不同的auth頭文件:pass,但沒有t help and it doesn t需要,因爲它應該沒有它,我認爲(至少FF和iOS應用程序沒有這個頭文件)工作。什麼會出錯?Android:HTTP POST響應 - 401

鉻的響應頭:

401 Unauthorized 

Loading time: 
29 
Request headers 
Content-Type: application/x-www-form-urlencoded 
Response headers 
Date: Mon, 04 Mar 2013 10:01:02 GMT 
Server: Apache/2.2.20 (Ubuntu) 
X-Powered-By: PHP/5.3.6-13ubuntu3.9 
Set-Cookie: peachy=qg3mjvchjh1oionqlhhv0jrn71; path=/ 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Vary: Accept-Encoding 
Content-Length: 96 
Keep-Alive: timeout=5, max=100 
Connection: Keep-Alive 
Content-Type: text/html; charset=utf-8 

火狐的響應頭:

Status Code: 200 OK 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Connection: Keep-Alive 
Content-Length: 202 
Content-Type: application/json 
Date: Mon, 04 Mar 2013 09:51:09 GMT 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Keep-Alive: timeout=5, max=100 
Pragma: no-cache 
Server: Apache/2.2.20 (Ubuntu) 
X-Powered-By: PHP/5.3.6-13ubuntu3.9 

這是我的Android應用寧靜的代碼和平:

public String serverRequest(int action, Bundle params) { 
    if (action == 0) { 
     if (Const.DEBUG_ENABLED) 
      Log.e(TAG, "You did not pass action."); 
     return "You did not pass action."; 
    } 

    try { 
     HttpRequestBase request = null; 
     HttpPost postRequest = null; 
     switch (action) { 
      case SIGN_IN: 
       request = new HttpPost(); 
       request.setURI(new URI(SIGNIN_URL)); 
       request.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); 

       postRequest = (HttpPost) request; 

       if (params != null) { 
       UrlEncodedFormEntity formEntity = new 
       UrlEncodedFormEntity(paramsToList(params)); 
       postRequest.setEntity(formEntity); 
       } 
       break; 

      case SIGN_OUT: 
       request = new HttpPost(); 
       request.setURI(new URI(SIGNOUT_URL)); 
       request.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); 
       break; 

      case BANK_CARD_VERIFY: 
       request = new HttpPost(); 
       request.setURI(new URI(BANK_CARD_VERIFY_URL)); 
       request.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); 

       postRequest = (HttpPost) request; 

       if (params != null) { 
        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(paramsToList(params)); 
        postRequest.setEntity(formEntity); 
       } 
       break; 
     } 

     if (request != null) { 
      DefaultHttpClient client = new DefaultHttpClient(); 

      if (Const.DEBUG_ENABLED) 
       Log.d(TAG, "Executing request: " + actionToString(action) + ": " + urlToString(action)); 

      HttpResponse response = client.execute(request); 

      StatusLine responseStatus = response.getStatusLine(); 

      int statusCode = responseStatus != null ? responseStatus.getStatusCode() : 0; 
      Log.d(TAG, "Status code: " + statusCode); 
      } 
      } 

(登錄並註銷是公開的,bank_verify是安全頁面。Android應用程序具有相同的響應頭像chrome)。看來會議或其他事情有問題,但我不確定。

編輯: 看來我發現這裏有什麼問題。在Android應用程序中,我創建了一個新的HttpCLient對象,因爲它的所有舊數據都丟失了。但另一個問題 - 如何使這個HttpCLient可重用?

+2

如果您已經找到答案,請將其*作爲答案*並接受。對於新問題,請打開一個新問題。 – sschrass 2013-03-04 14:20:34

回答

0

發現問題。儘管如此,我每次都重複使用httpClient,以便每次只使用一個擁有所有會話數據的程序。只要實現if語句來檢查我是否已經有了httpclient對象,那麼你就可以創建一個新對象。