使用Java的HttpURLConnection類可以實現HttpClient的功能,而不需要依賴任何其他類庫。所有有時候大家就直接使用它來完成一些簡單(或復雜)的功能。但是你活在偉大的{print G.F.W}后面,如果你需要訪問的網站被墻了,那HttpURLConnection類就會出現連接超時的錯誤。這時候就需要給他設置代理(Proxy)了。
設置代理(Proxy)可以有兩種方式:
1、通過設置系統屬性(System.setPropery(String key, String value)的方式
首先你可以在這里看到Java支持的屬性。我們可以使用其中的http.proxyHost,http.proxyPort這兩個屬性。顧名思義,就是分別設置代理服務器地址和代理端口。
//在你發起Http請求之前設置一下屬性 //通知Java您要通過代理進行連接 System.getProperties().put( "proxySet" , "true" ); //指定代理所在的服務器 System.getProperties().put( "proxyHost" , "127.0.0.1" ); //指定代理監聽的端口 System.getProperties().put( "proxyPort" , "8580" ); |
或者
System.setProperty( "http.proxyHost" , "www.proxy.com" ); System.setProperty( "http.proxyPort" , "8080" ); |
替換上面的www.proxy.com為你的代理服務器地址或IP地址,以及相應的端口為真實端口,Http連接及可以工作了。需要注意的是如果你設置了這些屬性,那么所有的Http請求都會通過代理服務器。這些屬性是JVM級別的,設置了以后對所有的同類請求都有效。比如上面的是關于http的,還有關于ftp的等等。
如果你的代理服務器不需要驗證,那到此就結束了。但一般都是需要驗證的。但是你要是看了上面Java支持的屬性列表,你就會發現那里面并沒有期望中的
- http.proxyUserName=username
- http.proxyPassword=password
這兩個屬性。 這時就需要java.net.Authenticator類來完成一般的Http驗證。但是java.net.Authenticator這個類卻是個抽象類,我們要使用還需要實例化一下子自己的類。個人覺得這里很不方便。如下:
- publicclass BasicAuthenticator extends Authenticator {
- String userName;
- String password;
- public BasicAuthenticator(String userName, String password) {
- this.userName = userName;
- this.password = password;
- }
- /**
- * Called when password authorization is needed. Subclasses should
- * override the default implementation, which returns null.
- *
- * @return The PasswordAuthentication collected from the
- * user, or null if none is provided.
- */
- @Override
- protected PasswordAuthentication getPasswordAuthentication() {
- returnnew PasswordAuthentication(userName, password.toCharArray());
- }
- }
我們需要覆蓋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還未做驗證。
文章列表