2011-01-25 88 views
20

我的代碼是這樣的:產生java.io.IOException:服務器返回的HTTP響應代碼:403網址

URL url; 
URLConnection uc; 
StringBuilder parsedContentFromUrl = new StringBuilder(); 
String urlString="http://www.example.com/content/w2e4dhy3kxya1v0d/"; 
System.out.println("Getting content for URl : " + urlString); 
url = new URL(urlString); 
uc = url.openConnection(); 
uc.connect(); 
uc.getInputStream(); 
BufferedInputStream in = new BufferedInputStream(uc.getInputStream()); 
int ch; 
while ((ch = in.read()) != -1) { 
    parsedContentFromUrl.append((char) ch); 
} 
System.out.println(parsedContentFromUrl); 

然而,當我試圖通過瀏覽器訪問URL是沒有問題的,但是當我嘗試通過Java程序訪問它,它會引起期待:

java.io.IOException: Server returned HTTP response code: 403 for URL 

什麼是解決方案?

回答

38

添加下面的代碼在uc.connect();uc.getInputStream();之間:

uc = url.openConnection(); 
uc.addRequestProperty("User-Agent", 
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"); 

然而,一個不錯的主意,只允許某些類型的用戶代理。這將保持您的網站安全和帶寬使用率低。

您可能希望阻止來自服務器的一些可能不好的「用戶代理」,具體取決於您是否希望人們泄漏您的內容和帶寬。但是,您可以在我上面的示例中看到用戶代理可以被欺騙。

+0

這個問題的一個很好的解釋會發現[這裏](http://stackoverflow.com/questions/31619746/why-should-i-access-a-url-using-a-user-agent) – manetsus

4

403意味着被禁止。從here: -

10.4.4 403禁止

服務器理解了請求,但 拒絕執行它。 授權不起作用,並且 請求不應重複。如果 請求方法不是HEAD,並且 服務器希望公佈爲什麼 請求未得到滿足,那麼 應該描述實體中拒絕的原因。如果服務器 不希望將該信息 提供給客戶端,則可以使用代碼404(未找到)的狀態 代替 。

您需要聯繫站點的所有者以確保權限設置正確。

編輯我看到你的問題。我通過Fiddler運行了這個URL。我注意到,我得到了407下面的意思。這應該有助於你走向正確的方向。

10.4.8 407需要代理身份驗證

此代碼類似於401 (未經授權),但表示該 客戶端必須首先驗證本身 與代理。代理必須返回 代理認證標頭字段 (14.33節),其中包含適用於 請求資源的代理的詢問 。客戶端MAY 用合適的 代理授權標頭字段 (第14.34節)重複請求。 HTTP訪問 驗證頁中的「HTTP 驗證:基本和摘要 接入認證」

也看到這個相關的問題。

+0

先生coolbeans,感謝您的及時回覆我看到了網,其說喜歡什麼ü已經提及,但沒有任何解決方案,我的意思是,如果內容是被禁止的,爲什麼我的瀏覽器可以訪問網址幾篇文章?再次感謝! – vaibhav

2

如果瀏覽器可以訪問該頁面,而您的代碼不能,那麼瀏覽器請求和您的請求之間會有所不同。您可以使用Firebug來查看瀏覽器請求,以瞭解它們之間的區別。有些事情我能想到的是:

  • 網站(也許登錄期間)設置一個 餅乾。您可能能夠在代碼中處理 ,您將不得不爲 明確添加對傳遞 Cookie的支持。這很可能。

  • 該網站根據用戶代理進行過濾。您可以設置用戶代理。這不太可能。

相關問題