Android Apache HttpClient 請求訪問返回403 forbidden
Android,使用Apache HttpClient 和 HttpURLConnection 訪問伺服器介面,被拒絕,返回403 forbidden,然而同樣的URL使用瀏覽器訪問是正常的。
(注:本篇問題僅限於Http請求,若是Https請求可先檢查SSL設定)
查了下關於403的幾種可能性:
403 禁止訪問:訪問被拒絕 403.1 禁止訪問:執行訪問被拒絕 403.2 禁止訪問:讀取訪問被拒絕 403.3 禁止訪問:寫入訪問被拒絕 403.4 禁止訪問:需要使用 SSL 檢視該資源 403.5 禁止訪問:需要使用 SSL 128 檢視該資源 403.6 禁止訪問:客戶端的 IP 地址被拒絕 403.7 禁止訪問:需要 SSL 客戶端證書 403.8 禁止訪問:客戶端的 DNS 名稱被拒絕 403.9 禁止訪問:太多客戶端試圖連線到 Web 伺服器 403.10 禁止訪問:Web 伺服器配置為拒絕執行訪問 403.11 禁止訪問:密碼已更改 403.12 禁止訪問:伺服器證書對映器拒絕了客戶端證書訪問 403.13 禁止訪問:客戶端證書已在 Web 伺服器上吊銷 403.14 禁止訪問:在 Web 伺服器上已拒絕目錄列表 403.15 禁止訪問:Web 伺服器已超過客戶端訪問許可證限制 403.16 禁止訪問:客戶端證書格式錯誤或未被 Web 伺服器信任 403.17 禁止訪問:客戶端證書已經到期或者尚未生效 403.18 禁止訪問:無法在當前應用程式池中執行請求的URL 403.19 禁止訪問:無法在該應用程式池中為客戶端執行CGI 403.20 禁止訪問:Passport 登入失敗通過一系列操作,排除法將問題鎖定在Http頭欄位的問題上。使用HttpWatch 檢測瀏覽器的頭欄位設定,發現User-Agent欄位可能存在問題。
列印源生的的User-Agent欄位是null,嘗試設定UA欄位,看下IE瀏覽器User-Agent的格式:
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4)"
HttpUriRequest.setHeader("User-Agent",“Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4)”);
(注:HttpUriRequest類是HttpGet 和 HttpPost的父類)
可以正常訪問了。
另外:我們可以使用User-Agent欄位做一些統計資訊的提交,只要遵從特定格式即可,例如:
“Mozilla/5.0 (Android/4.0.3; HUAWEI U9200; IMEI/111111111111111; IMSI/111111111111)”
可以根據自己的需要新增特定欄位。
自此我的問題解決了。
關於403,還存在另外一種可能,Referer 欄位,某些網站做了盜鏈的限制,僅限於本網站連結匯入的網址才可以訪問,這時我們可以設定Referer欄位:
HttpUriRequest.setHeader("Referer","http://,,,");
使用HttpURLConnection訪問的同學可以是用
conn.setRequestProperty("Referer", "http://,,,");
value欄位可以是訪問介面的域名地址。
相比起介面,圖片和檔案防止盜鏈的限制更多一些,也可以在下載圖片或其他型別檔案的請求中新增Referer頭欄位,問題就解決啦。