在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.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還未做驗證。