天天看點

Java使用代理Proxy通路網絡及其驗證

在java的網絡程式設計中,有時候内網伺服器需要通路外網的網絡資源,這時候就需要使用代理。

設定代理(proxy)可以有兩種方式:

1.通過設定系統屬性(system.setpropery(string key, string value)的方式

可以使用其中的http.proxyhost,http.proxyport這兩個屬性,分别設定代理伺服器位址和代理端口。

1

2

3

<code>//在你發起http請求之前設定一下屬性</code>

<code>system.setproperty(</code><code>"http.proxyhost"</code><code>, </code><code>"www.proxy.com"</code><code>);</code>

<code>system.setproperty(</code><code>"http.proxyport"</code><code>, </code><code>"8080"</code><code>);</code>

  

替換上面的代理伺服器位址或ip位址,以及相應的端口為真實端口,http連接配接就可以工作了。需要注意的是如果你設定了這些屬性,那麼所有的http請求都會通過代理伺服器。

這些屬性是jvm級别的,設定了以後對所有的同類請求都有效。

如果你的代理伺服器不需要驗證,那到此就結束了。但一般都是需要驗證的。但是你要是看了上面java支援的屬性清單,你就會發現那裡面并沒有期望中的

http.proxyusername=username 

http.proxypassword=password 

這兩個屬性。 這時就需要java.net.authenticator類來完成一般的http驗證。

但是java.net.authenticator這個類卻是個抽象類,我們要使用還需要執行個體化一下子自己的類。如下

Java使用代理Proxy通路網絡及其驗證
Java使用代理Proxy通路網絡及其驗證
Java使用代理Proxy通路網絡及其驗證
Java使用代理Proxy通路網絡及其驗證

我們需要覆寫java.net.authenticator類的getpasswordauthentication()方法,并傳回一個passwordauthentication執行個體。要使他起作用,還需要設定

authenticator.setdefault(new basicauthenticator(username, password)); 

這樣就提供了基于http basic的驗證,接着就可以順暢的使用需要驗證的代理了。

2.通過java.net.proxy類

這種方式是執行個體化一個proxy類提供代理伺服器的資訊,如端口和位址。

proxy proxy = new proxy(proxy.type.http, new inetsocketaddress(host, port)); 

urlconnection conn = url.openconnection(proxy); 

使用代理的方式是在打開http連接配接的時候同時傳遞一個proxy參數。如果需要驗證資訊的話我們可以添加一個http頭參數來實作。

//格式如下: 

"proxy-authorization"= "basic base64.encode(user:password)" 

string headerkey = "proxy-authorization"; 

string headervalue = "basic " + base64.encode(user+":"+password); 

conn.setrequestproperty(headerkey, headervalue); 

//.......... 

其中的base64.encode(user:password)是指把使用者名和密碼用冒号連接配接起來之後使用base64編碼後的值作為值的一部分。

通過這種方式隻影響特定的http連接配接,但是需要對代碼進行修改。這種方式下是否可以使用authenticator還未做驗證。