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

首頁 > 學院 > 開發(fā)設計 > 正文

通過自建代理服務器增強 Applet 的功能

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

眾所周知,java小應用程序(Applet)在網絡應用方面有著十分強大的功能,但是由于其存在著安全隱患,所以對于"她"的使用,JAVA語言做了很多的限制,想必大家都已經很清楚了,其中最讓人不開心的就是,小應用程序只能夠連接提供網頁的計算機(Applet必需嵌入到一個Html頁面中才能得以發(fā)布),但如何將您的小應用程序分發(fā)出去呢,這就是我們要討論的。
JAVA語言的"強項"就在于其網絡功能的強大和操作的簡易性,而小應用程序(Applet)作為JAVA技術的一部分,更是"錦上添花"。然而,您可否碰到過這樣的事情呢,"辛辛勞苦"做出了一個自認為很出色的Applet,可是運行時,卻是"千呼萬喚,她也不出來",原因何在呢,那就是JAVA語言對Applet的安全性做了多方面的限制,現(xiàn)在就讓我們了解一下吧!

Applet的安全性
您有沒有想過,通過Applet來連接一個網絡服務器;您有沒有想過,通過Applet來訪問本地的文件,……。我想您一定做過不少的嘗試,但結果總是讓人難以滿足,原困就是JAVA語言對Applet技術做了多方面的限制。

"Applet只能把電話打回家里"(摘自《JAVA2核心技術》),什么意思?大家不要會錯意了,這是說,網絡瀏覽器只答應一個小應用程序在給它提供服務的主機讀取和寫入數據。Applet只能連接其所駐留的計算機的套接字。

乍看起來,這個限制似乎毫無意義:為什么這個小應用程序被禁止執(zhí)行四周瀏覽器一直在執(zhí)行的操作,即是從網絡上某臺主機獲取數據的操作。也許大家有些不大明白,讓我們具體化這三個相關的主機,會有助于理解這個基本原理(參圖一)。

源主機--給客戶發(fā)送網頁和JAVA小應用程序的計算機。
本地主機--運行你的小應用程序的用戶計算機。
你的小應用程序預備訪問的第三方的數據存儲庫。

圖一 Applet安全性不答應連接第三方數據

Applet安全性規(guī)定:

Applet只能讀取源主機上的數據。
Applet不能寫入本地主機。
Applet不能讀取本地主機上的數據。

不能讓小應用程序寫入本地主機是因為Applet可能會向本地主機傳播病毒或修改它上面的重要文件,所以我們要保護運行小應用程序的客戶機;不能讓小應用程序讀取本地主機的信息是因為本地可能保留著用戶銀行卡數字等這類敏感的信息,因為小應用程序支持多線程,當你打開一個漂亮的頁面,使用它上面提供的有用的功能時,你可能不會意識到這個小應用程序背后的其它線程在做些什么。所以說,不能讓小應用程序對本地計算機進行讀寫操作是同樣重要的。

這樣還可以理解,但為什么這個小應用程序不能從網上讀取其它文件呢?網絡不正是一個公用信息資源庫嗎?難道不是每個人都可以從網上讀取信息嗎?假如你在家里利用括號設備訪問Internet的話,可能是能夠隨心所欲的。但是你假如是一名公司的職員,在公司內部使用網絡資源,正好你們所在公司又恰好安裝了防火墻(FireWall),那么情況就完全不一樣了。

假如要具體介紹防火墻,可能最近幾天大家都有不要睡覺了,所以這里只是說一下防火墻的功能。可以這樣理解一個防火墻就是一個計算機,它過濾進出公司局域網的數據包。通過對安全策略的設置,它可以完成很多功能。例如:它可以拒絕局域網內除了郵件服務器以外的所有主機上郵件端口的訪問請求防火墻也可以過濾公司局域網與Internet之間的通信規(guī)則,所有的這些完全取決于安全的需要。(參圖二)

圖二 利用防火墻提供安全性

擁有一個防火墻可以讓一個公司利用網絡向雇員發(fā)送對他們有重要意義的內部信息,但同時拒絕來自公司外部的訪問。一個公司只需簡單的安裝一臺網絡服務器,把其地址通知全部的雇員,并設立防火墻以拒絕任何來自公司外部的訪問這個服務器的請求。而公司的職員可以用安全的使用公司內部的網絡,瀏覽服務器。

假如一個雇員訪問了你提供的網頁(含有Applet的網頁),那么就會有一個小應用程序被下載到裝有防火墻的計算機并開始在那里運行。假如這個小應用程序可以讀取它駐留的瀏覽器讀取的所有網頁,就可以訪問這個公司內的住處接著,它可以連接一個主機,并利用這個主機接收和送回所有私人信息。顯然這是不安全的。

這簡直太糟糕了,真的,你不能自己編寫運行于網上的小應用程序,獲取信息,處理和格式化這些信息,并把它們發(fā)送給Applet用戶。假如,我們的小應用程序只是想得到一些信息,而并不想向它的主機寫回任何信息,難道這樣也不行嗎?為什么不能讓瀏覽器和這個小應用程序簽一個協(xié)議呢?假如這個小應用程序答應不向任何地方寫入數據,那么它應該能讀取任何地方的數據。這樣的話,她只充當一個住處捕捉者和處理者,并在用戶屏幕顯示瞬息的結果。(實現(xiàn)上,這是可行的,這就是目前最為流行的"數字簽名技術",以后我們在作介紹,這里我們介紹的是另外一種解決方法。)

代理服務器
除了"數字簽名技術"這種高級技術外,我們還可以使用其它的方法來加以實現(xiàn)。比如,你可以建一個網頁,它可以內嵌你想要運行的小應用程序(這時它用的是存儲你的服務器的假數據)。你可以提供一個按鈕,用戶可以使用這個按鈕下載這個小應用程序和相應的策略文件,這樣用戶就可以從這個小應用程序運行的瀏覽器中運行它了。雖然這是一個可行的方法,但卻使你的小應用程序的"魅力"大打折扣。好在還有另外一種方法。

代理服務器方法是另外一種突破安全性的限制,實現(xiàn)信息的提取,現(xiàn)在我們就具體的介紹一下。

在你的WEB服務器上安裝一個代理服務器。它是一個服務程序,隨著服務器的啟動而自動運行,這個程序可以獲取來自于網頁的請求信息,并發(fā)送給請求它的任何人。舉個例子來看一下:假設你的小應用程序向駐留在同一臺主機上的代理服務器發(fā)關一個GET請求
http://www.server.com/PRoxysvr?URL=http://www.yahoo.com/search.pl?Name=java

那么代理服務器會為這個小應用程序取回網頁,并把它做為GET請求的答復發(fā)送回來,這樣小應用程序就可以處理取回的信息了(參圖三)

圖三 通過代理服務器獲取數據的流程

由此可見代理服務器可以實現(xiàn)這個功能,但現(xiàn)有的代理服務器都是功能豐富,而我們只是利用它的最基本的功能,所以建議大家用JAVA自己寫一段代碼。我們是用Servlet來實現(xiàn)的,一個Servlet是由一個Servlet引擎來啟動的。現(xiàn)在大部分的網絡服務器都可以運行Servlet。
代理服務器源代碼(ProxySvr.java)

import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ProxySvr extends HPPTServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws SevletException, IOException {
String query = null;
response.setContentType("text/html");
PrintWriter out = response.getWriter();
query = request.getParameter("URL");
if(query == null) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST,
"Missing URL parameter");
return;
}
try {
query = URLDecoder.decode(query);
} catch(Exception exception) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST,
"URL decode error " + exception);
return;
}
try {
URL url = new URL(query);
BufferedReader in = new BufferedReader(new
InputStreamReader(url.openStream()));
String line;
while((line = in.readLine()) != null)
out.println(line);
out.flush();
} catch(IOException exception) {
response.sendError(HttpServletResponse.SC_NOT_FOUND,
"Exception: " + exception);
}
}
}

說明:WEB服務器的Servlet服務接收到一個GET請求時,它調用doGet()方法。HttpServletRequest參數包含請求參數。這個Servlet用getParameter()方法得到URL參數的值。在任何Servlet中,你需要把響應答復發(fā)送給HttpServletResponse類的getwriter()方法返回的PrintStream,這個Servlet連接URL參數指定的資源,每次讀取它的數據,并把它發(fā)送給響應流。最后,用sendError()方法報告出現(xiàn)的錯誤。

小結
現(xiàn)在讓我們回顧一下為什么代理服務器可以解決這個小應用程序的安全問題。當你的小應用程序要訪問來自異地主機的信息時,它會將請求發(fā)送給駐留在本機上的代理服務器,然后代理服務器連接要訪問的異地主機,取出所要求的數據,然后將數據返回給小應用程序。

雖然幾經周折,但是卻可以避免安全性的問題。OK,這也許并不是最好的解決方案,但是,它確實是一種實用的解決方案,歡迎大家一起研究。

參考資料

下面是上述程序的源代碼(Zip格式)ProxySvr.zip
《JAVA2核心技術》機械工業(yè)出版社
java.sun.com http://java.sun.com/docs/books/jls/index.html

--摘自IBM網站
http://www-900.ibm.com/developerWorks/cn/java/l-papplet/index.shtml

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 景东| 固阳县| 花垣县| 裕民县| 监利县| 尤溪县| 桂平市| 宜宾县| 丽水市| 苍梧县| 安国市| 兰西县| 柘荣县| 西乌珠穆沁旗| 雅江县| 罗山县| 自治县| 白城市| 磐安县| 武乡县| 晋城| 遂溪县| 临武县| 望都县| 苍溪县| 泰顺县| 昭苏县| 冷水江市| 尖扎县| 那坡县| 敦煌市| 山西省| 南靖县| 惠安县| 东港市| 黔南| 县级市| 乌海市| 灵宝市| 新巴尔虎左旗| 丹寨县|