1. 程式人生 > >Android Apache HttpClient 請求訪問返回403 forbidden

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頭欄位,問題就解決啦。