2011-06-30 24 views
6

我有一個服務器使用spring安全記憶我認證,我在POST方法中使用Android DefaultHttpClient登錄。 我能夠成功登錄,甚至能夠檢索創建的會話cookie(在我的情況下jsessionid cookie和春季安全記得我cookie)。Android DefaultHttpClient HttpResponse缺少Set-Cookie標頭字段

但奇怪的是執行POST方法類似

mResponse = mDefaultHttpClient.execute(mHttpPost) 

我能夠檢索的cookies,但只使用getCookieStore方法在我DefaultHttpClient如不使用getAllHeaders方法

mDefaultHttpClient.getCookieStore() 

後的HttpResponse對象

headers = mResponse.getAllHeaders(); 
HeaderIterator headerIterrator = new BasicHeaderIterator(headers, null); 
while (headerIterrator.hasNext()) { 
    Header header = headerIterrator.nextHeader(); 
    headerStringBuilder.append(" " + header.getName() + ":" + header.getValue()); 
} 
Log.e("Post response headers: ", headerStringBuilder.toString()); 

我得到了一些hea (服務器,X-powered-By,日期,內容類型,內容長度)但不包括Set-Cookie頭或其他幾個(訪問控制 - 允許等*)

感謝任何幫助!

更新:看起來像DefaultHttpClient不公開某些標頭。我嘗試添加響應攔截器(如下所示),並且getAllHeaders返回了我想要的所有標題。感謝您閱讀我的問題!

mDefaultHttpClient.addResponseInterceptor(new HttpResponseInterceptor() { 
    public void process(final HttpResponse response, final HttpContext context) 
       throws HttpException, IOException { 
      Header[] headers = response.getAllHeaders(); 
      for (int i = 0; i < headers.length; i++) { 
       Header header = headers[i]; 
       Log.e("HTTP: ", "name: " + header.getName()); 
       Log.e("HTTP: ", "value: " + header.getValue()); 
      } 
     } 

    }); 
+0

你可以嘗試的例子在我的問題在這裏:http://stackoverflow.com/questions/3858593/android-http-get-session-cookie看看你得到了同樣的問題 – Blundell

+0

@Blundell,感謝您的評論,是的,我試過這個例子,但只是與上面相同的一組頭文件返回。 – Json

+0

我認爲在實際請求期間會填充一些標題,特別是那些可能具有有限生命週期的標題。 – njzk2

回答

1

您是否嘗試過使用HttpURLConnection而不是HttpClient?正如名字所述,HttpClient是一個客戶端,然後它爲您管理cookie,而HttpURLConnection則不會。

Doc說:「HTTP客戶端封裝了處理cookie,驗證,連接管理和其他功能時執行HTTP請求所需的對象的混合物。」

0

如果您在服務器端設置cookie,如php中的session_start(),則Set-Cookie在標頭中顯示,但如果您沒有設置任何Cookie,則Set-Cookie未顯示。

後:

05-25 17:23:16.616: I/HTTP:(575): name: Set-Cookie 
05-25 17:23:16.616: I/HTTP:(575): value: PHPSESSID=g29i01av8ddvpgsi7lpaj12lc3; path=/