国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

使用Java連接處于proxy(or防火墻)之外的HTTP服務器

2019-11-18 15:13:42
字體:
來源:轉載
供稿:網友

我到sun站點上,發現他們的java Applet聊天室能夠突破PRoxy,
我在公司的局域網可以使用的,而一般的java程序是不能夠的。
大家可以去分析一下他們的程序

本技巧將向您講述如何編寫可通過代理訪問因特網上的 Web 服務器的 Java 應用程序。在 Java 應用程序中加入代理支持只需額外編寫幾行代碼,且不依靠任何安全性“漏洞”。
幾乎所有的公司都十分關注保護自己的內部網絡,以防黑客及入竊者。一種常見的安全措施是完全斷開與因特網的連接。假如黑客們不能連接到您的任何一臺機器,他們就不能非法進入您的系統。這種策略產生的不利副作用是,內部用戶無法訪問外部的因特網服務器,如 Yahoo 或 JavaWorld。為了解決這一問題,網絡治理員通常安裝“代理服務器”。實際上,代理是安裝于因特網和內部網之間的一種服務,用來治理這兩個領域之間的連接。代理有助于減少安全性的外部威脅,同時還答應內部用戶訪問因特網服務。盡管 Java 使得編寫因特網客戶機不再困難,但是假如客戶機不能通過代理,則它們毫無用處。幸運的是,Java 使得使用代理支持不再困難 -- 假如您知道密訣,這就是事實。
將 Java 和代理結合起來的秘訣即在 Java 運行時激活特定的系統屬性。這些屬性未被寫入正式文件,只是作為 Java 傳說的一部分在 Java 編程人員中秘傳。為了支持代理,Java 應用程序不僅需要指定代理本身的信息,而且需要指定用于認證的用戶信息。在開始使用網際協議之前,您需要在程序中添加以下幾行代碼:

System.getProperties().put( "proxySet", "true" );
System.getProperties().put( "proxyHost", "myProxyMachineName" );
System.getProperties().put( "proxyPort", "85" );

上面的第一行通知 Java 您要通過代理進行連接,第二行指定代理所在的機器,第三行指定代理監聽的端口。有些代理在授權用戶訪問因特網之前,要求用戶輸入用戶名和口令。假如您使用位于防火墻之內的 Web 瀏覽器,您就可能碰到過這種情況。以下是執行認證的方法:

URLConnection connection = url.openConnection();
String passWord = "username:password";
String encodedPassword = base64Encode( password );
connection.setRequestProperty( "Proxy-Authorization", encodedPassword );

這段代碼的思想是,您必須調整 HTTP 標頭以發出用戶信息。這是通過調用 setRequestProperty() 來實現的。這種方法答應您在發出請求之前處理 HTTP 標頭。HTTP 要求用 base64 對用戶名和口令進行編碼。幸運的是,有一組公用域 API,它們將代您執行編碼(請參閱參考資源部分)。

如您所見,在 Java 應用程序中加入代理支持并不需要做多少工作。有了現在的知識,再做一點研究(您必須查明您的代理是如何處理您感愛好的協議以及如何進行用戶認證的),您就能用其他協議實現代理。

FTP 代理
Scott D. Taylor 提出這個秘訣來處理 FTP 協議代理:

defaultProperties.put( "ftpProxySet", "true" );
defaultProperties.put( "ftpProxyHost", "proxy-host-name" );
defaultProperties.put( "ftpProxyPort", "85" );

接下來您便可以通過以下代碼使用 "ftp" 協議訪問文件 URL:

URL url = new URL("ftp://ftp.netscape.com/pub/navigator/3.04/windows/readme.txt" );

假如有人有使用其他網際協議代理的例子,我很想看看。

注重:代碼示例 (Example.java) 僅在 JDK 1.1.4 下測試過。

后續技巧!
來自 Marla Bonar:

對于仍在使用 JDK 1.1.7(配合 WebSphere 3.0)的開發人員而言,將 proxyHost 和 proxyPort 設為系統屬性不起作用;conn.getInputStream() 或者返回連接超時,或者是找不到主機路徑。但是,我使用接受 Host 和 Port 為參數的 URL 構造函數解決了這一問題(使用我的代理主機和端口):

public URL(String protocol, String host, int port, String file).

來自 Dylan Walsh:

借助用戶名和口令進行認證的方法不起作用。應將 "Basic " 置于認證字符串的開頭;例如:

String encodedPassword = base64Encode( password );

應該是:

String encodedPassword = "Basic " + base64Encode( password );

您也不必用一個單獨的程序來進行 64 位編碼。您可以使用 sun.misc.BASE64Encoder() 類。下面是完成這兩處改動之后的代碼:

System.getProperties().put("proxySet", "true");
System.getProperties().put("proxyHost", proxyHost);
System.getProperties().put("proxyPort", proxyPort);
String authString = "userid:password";
String auth = "Basic " + new sun.misc.BASE64Encoder
().encode(authString.getBytes());
URL url = new URL("http://java.sun.com/");
URLConnection conn = url.openConnection();
conn.setRequestProperty("Proxy-Authorization", auth);

來自 Marcel Oerlemans:

下面是使用 socks 4 代理服務器的方法:

System.getProperty("socksProxySet", true);
System.getProperty("socksProxyHost", proxyHostName);
System.getProperty("socksProxyPort", proxyPort);
Usually the proxyPort for Socks 4 is port 1080

接下來您就可以用 Socks 4 進行連接了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 如东县| 东明县| 阿城市| 新闻| 蓬溪县| 织金县| 扬州市| 涿州市| 汉沽区| 新民市| 栖霞市| 乐山市| 江孜县| 双辽市| 宾阳县| 宝兴县| 玛沁县| 万盛区| 浠水县| 额济纳旗| 嵊泗县| 农安县| 牙克石市| 阳谷县| 云和县| 类乌齐县| 东方市| 藁城市| 额济纳旗| 上犹县| 甘德县| 曲麻莱县| 阿拉善右旗| 永仁县| 交口县| 新源县| 资中县| 西贡区| 陆川县| 衡南县| 滁州市|