2013-01-01 84 views
10
System.setProperty("http.proxySet", "true"); 
System.setProperty("java.net.useSystemProxies", "true"); 
System.setProperty("http.proxyHost", "192.168.1.103"); 
System.setProperty("http.proxyPort", "3128"); 
System.setProperty("http.proxyUser", "user123"); 
System.setProperty("http.proxyPassword", "passwD123"); 

url = new URL("http://www.google.co.in"); 
每次

處理時,我使用此代碼IOException異常拋出一個說HTTP響應代碼407 HTTP 407意味着需要代理認證。爲什麼在我設置proxyUser和proxyPassword時出現此問題。 enter image description here
如果我輸入了錯誤的密碼,會發生http 401,但它總是給我407,這意味着我的代碼不需要用戶名和密碼。在上面的代碼中user123是用戶名,passwD123是代理認證的密碼。HTTP 407代理認證:如何在Java代碼中

+1

的HTTP客戶端您使用的? – Cratylus

+0

我正在嘗試在java中製作手動代理,自動代理,無代理支持瀏覽器。像Firefox這樣的瀏覽器支持這個,工具 - >選項 - >高級 - >網絡 - >設置。 – dayitv89

回答

19

http://blog.vinodsingh.com/2008/05/proxy-authentication-in-java.html

我找到了解決辦法感謝維諾德·辛格先生。在Java中

代理身份驗證通常的企業網絡提供了通過代理服務器上網,有時他們需要進行身份驗證也是如此。可能的應用程序確實打開了與企業內部網絡外部的服務器的連接。所以必須以編程方式進行代理身份驗證。幸運的是,Java提供了一種透明的機制來進行代理認證。

創建一個簡單的類象如下─

import java.net.Authenticator; 

class ProxyAuthenticator extends Authenticator { 

    private String user, password; 

    public ProxyAuthenticator(String user, String password) { 
     this.user = user; 
     this.password = password; 
    } 

    protected PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication(user, password.toCharArray()); 
    } 
} 

,並把這些代碼行的代碼打開URLConnection-

Authenticator.setDefault(new ProxyAuthenticator("user", "password")); 
System.setProperty("http.proxyHost", "proxy host"); 
System.setProperty("http.proxyPort", "port"); 

之前,現在,所有的呼叫都將順利通過代理認證。

+2

此代碼用於手動代理支持。 – dayitv89

+0

我在eclipse上用用戶名和密碼在運行配置中設置了http和https代理,由於某些原因它間歇性地工作,這很奇怪。 –

7

@GauravDS 你提到:

http://blog.vinodsingh.com/2008/05/proxy-authentication-in-java.html 我找到了解決辦法感謝維諾德·辛格先生。 Java中的代理認證 通常的公司網絡通過代理服務器提供互聯網訪問,有時他們也需要認證。可能的應用程序確實打開了與企業內部網絡外部的服務器的連接。所以必須以編程方式進行代理身份驗證。幸運的是,Java提供了一種透明的機制來進行代理認證。 創建一個簡單的類如下 - 。


並且在代碼打開之前放上這些代碼行URLConnection- Authenticator.setDefault(new ProxyAuthenticator("user", "password")); System.setProperty("http.proxyHost", "proxy host"); System.setProperty("http.proxyPort", "port"); 現在所有的調用都會成功通過代理驗證。

如果您要連接到的網站還需要用戶名/密碼才能允許,該怎麼辦? 設置一個默認的身份驗證器(Authenticator.setDefault)將失敗我猜當外部網站將尋找經過身份驗證的用戶。

任何意見?....有人?

編輯:1 以前使用此代碼,並得到錯誤(407)代理身份驗證要求。 我認爲這是因爲身份驗證是由不同主機請求的。當您爲一臺主機設置一個用戶/密碼的默認身份驗證器時,則其他請求主機的身份驗證將失敗。我昨天做了以下更改爲SimpleAuthenticator類,現在它像一個魅力。

protected PasswordAuthentication getPasswordAuthentication() 
    { 
    String requestingHost = getRequestingHost(); 
    if (requestingHost == proxyHost){ 
     System.out.println("getPasswordAuthentication() request recieved from->" + requestingHost); 
     return new PasswordAuthentication(proxyuser,proxypass.toCharArray()); 
    } 
    else{ 
     System.out.println("getPasswordAuthentication() request recieved from->" + requestingHost); 
     return new PasswordAuthentication(sharepointusername,sharepointpassword.toCharArray()); 
    } 

    } 

此處瞭解詳情:http://blog.ashwani.co.in/blog/2013-07-29/access-sharepoint-webservices-from-java-behind-proxy/

+0

什麼http響應爲站點身份驗證? 以上公司/研究所網絡中代理服務器的機制。 – dayitv89

+0

上面編輯了我的回覆。 – TheAshwaniK

+1

您也可以檢查'getRequestorType()== RequestorType.PROXY'。身份驗證對於信任或登錄應用程序通常使用401和代理使用407. –