2012-12-17 54 views
0

我有點瘋狂的問題。我有一個IIS7,我需要通過POST發佈一個公式,我也需要通過NTLM進行身份驗證,所有這些東西都會引發SSL連接。到目前爲止,我管理它連接到服務器併發布我的數據。如何解決我的應用程序的android源代碼中的錯誤?

在POST之後,我會成功的將302重定向到第二頁。 DefaultHttpClient連接到Web服務器進行身份驗證併發布數據。到目前爲止,一切正常但是現在客戶關閉了連接並打開了第二個連接(這個行爲對我有用),但這不是我的問題。在第二個連接上,客戶端忘記了如何在IIS上進行身份驗證,並打破401身份驗證錯誤。

到目前爲止,我可以看到這是一個固定的錯誤source of DefaultHttpClient,但Android似乎使用這個lib的舊版本。我該如何解決這個似乎在世界上每個Android設備上的錯誤?

這裏是我的通信相關部分:

POST /login/ HTTP/1.1 
Content-Length: 21 
Content-Type: application/x-www-form-urlencoded 
Host: example.com 
Connection: Keep-Alive 
Cookie: ASPSESSION... 

[the post data] 

HTTP/1.1 401 Unauthorized 
Content-Type: text/html 
Server: Microsoft-IIS/7.5 
WWW-Authenticate: NTLM 
Content-Length: 1344 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
... 
</html> 

POST /login/ HTTP/1.1 
Content-Length: 21 
Content-Type: application/x-www-form-urlencoded 
Host: example.com 
Connection: Keep-Alive 
Cookie: ASPSESSION... 
Authorization: NTLM ABC...== 

[the post data] 

HTTP/1.1 401 Unauthorized 
Content-Type: text/html; charset=us-ascii 
Server: Microsoft-HTTPAPI/2.0 
WWW-Authenticate: NTLM ABC...DEF 
Content-Length: 341 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"> 
<HTML><HEAD><TITLE>Not Authorized</TITLE>...</HTML> 

POST /login/ HTTP/1.1 
Content-Length: 21 
Content-Type: application/x-www-form-urlencoded 
Host: example.com 
Connection: Keep-Alive 
Cookie: ASPSESSION... 
Authorization: NTLM ABC...DEF 

[the post data] 

HTTP/1.1 302 Moved Temporary 
Cache-Control: private,no-cache 
Pragma: no-cache 
Content-Length: 31 
Content-Type: application/json; Charset=UTF-8 
Expires: Fri, 07 Dec 2012 07:01:00 GMT 
Location: /login/step2.asp 
Server: Microsoft-IIS/7.5 
Set-Cookie: [...] path=/login/; HttpOnly; 
Persistent-Auth: true 

[some response] 

---現在這樣的引黃密切和第二HTTPS連接打開---

GET /login/step2.asp HTTP/1.1 
Host: example.com 
Connection: Keep-Alive 
Cookie: ASPSESSION... 


HTTP/1.1 401 Unauthorized 
Content-Type: text/html 
Server: Microsoft-IIS/7.5 
WWW-Authenticate: NTLM 
Content-Length: 1344 

---和連接再次關閉---

你知道一種方法來解決這個問題嗎?

回答

0

那麼這是沒有解決方案只是解決我的問題,但這可能有所幫助。我重寫DefaultHttpClient中的createClientRequestDirector函數,我在這裏處理重定向。

連接關閉的原因是我玩的主機名,所以我連接到IP而不是主機名。結果是,如果可以通過比較源網址和目標網址來重新使用連接,則客戶端會在重定向時查找。所以它將被比較https://www.example.com/https://127.0.0.1/其失敗和結局將被關閉。

我的解決方案是我自己檢查這部分。如果主機名和IP匹配,我會返回上次使用的IP。結果是連接可以被重用,並且我不會在上面鏈接的bug中運行。

1

爲什麼你不只是得到新版本的DefaultHttpClient的庫,並將其包含在你的項目中?

+0

我覺得那不是那麼簡單。我不確定是否可以更改Java文件的發佈者的軟件包名稱。而且我知道android團隊修改了大量文件。你有一個envidence,這不會破壞什麼? – rekire

+0

我認爲Android使用標準的DefaultHttpClient ..但是,我不能確定。再一次,除非你嘗試過,否則你永遠不會知道,對吧? –

+0

當然,我正在閱讀'DefaultRequestDirector'類,在那裏我發現了連接關閉的原因。我會在使用Apache代碼之前嘗試解決這個問題。 – rekire

相關問題