轉自:http://www.educity.cn/wenda/360966.html
本文檔主要從什麼是Applet、Applet在浏覽器環境下如何運用以及如何突破Applet的安全限制。
一、什麼是Applet
Java Applet 是用Java 語言編寫的小應用程式,這些程式是直接嵌入到頁面中,
由支援Java的浏覽器(IE 或 Nescape等)解釋執行,能夠産生特殊效果的程式。
它可以大大提高Web頁面的互動能力和動态執行能力。包含Applet的網頁被稱為Java-powered頁,可以稱其Java支援的網頁。
二、Applet用法
1.确定包含在HTML文檔中的Java Applet程式已經存在;
2.調用"applet"格式(以Java01.class 為例)
< applet code="Java01.class" codebase="javam" width=100 height=60 vspace=2
hspace=3 align="top" name="Java01" alt="你的浏覽器不支援 Java Applet 程式"
$amp;>amp;$lt;/applet>
A.code屬性:定義調用的Java Applet 程式名,要注意全名和大小寫。
B.codebase屬性:定義Java Applet 程式的路徑或位址(URL),當Java Applet與HTML文檔不在同一目錄時用它來定位,
上面調用格式中codebase="javam"說明該Java Applet程式存放在"javam"目錄裡
(建議将Java Applet 程式和HTML文檔放在同一目錄)。
C.width和height屬性:給出Java Applet程式顯示區域以像素為機關的寬度和高度。
D.vspace和hspace屬性:用來設定以像素為機關的豎直和水準邊距。
E.align屬性:控制Java Applet的對齊方式,取值如下:
left(螢幕的左邊)
right(螢幕的右邊)
top(與該行中最高項的頂部對齊)
texttop(與該行文本的頂部對齊)
middle(使該行的基線與該Java Applet程式顯示域的中間對齊)
absmiddle(使該行的中間與該Java Applet程式顯示域的中間對齊)
baseline(使該行的基線與該Java Applet的程式顯示域的底部對齊)
bottom(使該行的基線與該Java Applet的程式顯示域的底部對齊)
absbottom(使該行的底部與圖像的底部對齊)
F.archive屬性:用逗号分隔的歸檔檔案清單(HTML 4.0 )
G.object屬性:序列化的applet檔案(HTML 4.0)
H.name屬性:為應用的Applet 執行個體賦一具體的名字。
J.alt屬性:為不支援Java Applet程式的浏覽器顯示你替代的文字,如果支援該屬性被忽略。
I.另:為不支援Java Applet程式的浏覽器顯示你替代的文字,
還可以用在<applet>與</applet>之間插入文字的方法進行,反之該插入文字被忽略不顯示。
3.向 Applet 傳遞變量
A.确定該 Java Applet 程式所接受的變量名,比如 size、font兩個變量;
B.在<applet$amp;>amp;$lt;/applet>之間輸入<param>标記,
<applet code="Java01.class" codebase="javam" width=100 height=60 >
<param>
</applet>
C.給<param>标記加入name屬性并設定為Java Applet中将接收值的變量名
<applet code="Java01.class" codebase="javam" width=100 height=60 >
<param name="size">
<param name="font">
</applet>
D.加入value屬性為前面定義好的變量指派。
<applet code="Java01.class" codebase="javam" width=100 height=60 >
<param name="size" value="5" >
<param name="font" value="bold" >
</applet>
E.當浏覽器遇到<applet>标記中的<param>标記時,它讀進變量名和賦予的值傳遞給目前Java Applet中的命名變量。
三、Applet安全限制
在預設的情況下,Applet在安全方面受到諸多的限制,幾乎不能對系統進行任何“讀”“寫”的操作。
下面受限制的功能:
不允許Applet讀本地系統上的檔案。例如,下面的代碼将出錯:
File readFile=new File("/etc/passwd");
FileInputStrean readIn=new FileInputStream(readFile);
不允許Applet建立,修改或删除本地系統的檔案。例如,下面的代碼将出錯:
//不能建立檔案
File writeData=new File("write.txt");
FileOutputStream out= new FileOutputStream(writeData);
cut.write(1);
//不能修改或删除檔案,不能更改檔案名
File oldName =new File("one.txt");
File newName= new File("two.txt");
oldName.renameTo(newName);
File removeFile=new File("inport.dat");
removeFile.delete();
不允許Applet檢查本地系統上檔案是否存在。例如,下面的代碼将出錯:
File isHere = new File("grades.dbm");
isHere.exists();
不允許Applet在本地系統上建立目錄。例如,下面的代碼将出錯:
File createDir= new File("mydir");
createDir.mkdir();
不允許Applet檢查目錄的内容。例如,下面的代碼将出錯:
String[] fileNames;
File lookAtDir= new File("/user/hisdir");
fileNames = lookAtDir.list();
不允許Applet檢查檔案的屬性。例如,不允許檢查檔案的尺寸、類型、最後更改時間等、
例如,下面的代碼将出錯:
File checkFile= new File("this.dat");
ling checkSize;
boolean checkType;
long checkModTime;
checkSize= checkFile.length();
checkTyty= checkFile.isFile();
checkModTime= checkFile.lastModified();
Applet不能建立或裝載Applet的機器的網絡連接配接。
無論使用何種不同的網絡Java類(包括:java.net.Socket,java.net.URL,and
java.DatagramSocket),這個規則都成立。例如,假設Applet被下載下傳到,
下面的代碼将出錯:
//不能打開TCP socket.
Socket mailSocket = new Socket("mai",25);
//不能使用URL對象
URL untrustedWeb=new URL("");
URLConection agent= untrustedWeb.openConnection();
agent.connect();
//不能使用UDP資料報發送資料
InetAddress thetSize=new InetAddress("WW");
int thatPort=7;
byte[] data= new byte[100];
DatagramPacket sendPacket= new DatagramPacket(data,data.lenght,thatSize,thatPort);
DatagramSocket sendSocket=new datagramSocket();
sendSocket.send(sendPacket);
Applet不能充當網絡伺服器,監聽或接收來自遠端系統的連接配接請求。
例如,下面的代碼将出錯:
ServerSocket listener= new ServerSocket(8000);
listener.accept();
Applet不能執行任何本地計算機上的程式。例如,下面的代碼将出錯:
String command="DEL\AUTOEXEC.BAT";
Runtime systemCommands=Runtime.getRuntime();
systemCommands.exec(command);
不允許Applet裝載動态庫或定義本地方法調用。例如,下面的代碼将出錯:
Runtime systemCommands= Runtime.getRuntime();
systemCommands.loadLibrary("local.dll:);
在Java環境中,設定了一些标準的系統屬性,
jaxa.lang.System.getProperty(String kcy) 方法可以出來通路這些屬性,
對于Applet而言,某些系統屬性是隻讀的。這些屬性包括:file.separator,
java.class.path,java.class.version,java.home,java.vendor,
java.vendor.url,java.version,line.separator,os.arch,os.name,
os.version,path.separator,user.dir,user.home,user.name。
Applet不能操縱不在自己線程組中的任何線程。
Applet不能關閉JVM。例如,下面的代碼将出錯:
Runtime systemCommands=Runtime.getRuntime();
systemCommands.exit(0);
system.exit(0);
Applet不能建立SecurityManager或ClassLoader實體。
這些政策表達了一些嚴格的限制,應該清楚在預設的情況下,
Applet可以做什麼,不可以做什麼,正确對待一些非程式設計方面的錯誤。
四、Applet數字簽名
步驟一:将Applet Class打成Jar包
如:在指令行中執行以下的語句:
jar -cvf MyApplet.jar class
步驟二:(在網頁中嵌入Applet)(如何在Html嵌入Apple方法見附錄)
下面是嵌入Applet部分的寫法:
<APPLET
CODEBASE = "."
CODE = "jcomponent.FileReaderApplet.class"
ARCHIVE ="MyClass.jar"
NAME = "TestApplet"
WIDTH = 400
HEIGHT = 300
HSPACE = 0
VSPACE = 0
ALIGN = middle
>
</APPLET>
步驟三:(生成證書及簽名)
1、keytool -genkey -keystore pepper.store -alias pepper
這個指令用來産生一個密匙庫,執行完畢後應該在c:/admin中産生一個pepper.store的檔案,
這裡的pepper是我自己的名字,你可以對它進行修改。另外在執行指令的時候還有提示
你輸入密匙庫的密碼,這裡你一定要記住,否則後面要用的時候無法輸入。
2、keytool -eXPort -keystore pepper.store -alias pepper -file pepper.cert
這個指令用來産生簽名時所要用的證書,同樣這裡的pepper也可以換成你自己需要的名字。
這個指令執行完後在c:/admin中産生一個pepper.cert的檔案。
3、 jarsigner -keystore pepper.store MyApplet.jar pepper
這個指令用上面産生的證書将我們的jar檔案進行了簽名。
步驟四:建立一個政策檔案,并把這些政策檔案加入(修改檔案)
1、在c:/admin中産生一個名為applet.policy的檔案,其内容如下:
keystore "file:c: /admin/pepper.store", "JKS";
grant signedBy "pepper"
{ permission Java.io.FilePermission "<<ALL FILES>>", "read";=;
這個檔案讓由pepper簽名的Applet擁有本地所有檔案的讀權限。
2、修改${java.home}/jre/lib/security目錄下的java.security,找到下面這兩行:
policy.url.1=file:${java.home}/lib/security/java.policy
policy.url.2=file:${user.home}/.java.policy
在下面添寫第三行
policy.url.3=file:c: /admin/applet.policy
完成這個修改後我們在前面建立的applet.policy檔案才有效。
步驟五:(轉換html檔案)
運作前面提到的HTMLConvert工具,将原有的FileReaderApplet.html轉化成下面的形式:
<!--"CONVERTED_APPLET"-->
<!-- CONVERTER VERSION 1.3 -->
<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
WIDTH = 400 HEIGHT = 300 NAME = "TestApplet" ALIGN = middle VSPACE = 0 HSPACE=0
codebase="
jinstall-13-win32.cab#Version=1,3,0,0">
<PARAM NAME = CODE VALUE = "jcomponent.FileReaderApplet.class" >
<PARAM NAME = CODEBASE VALUE = "." >
<PARAM NAME = ARCHIVE VALUE = "MyApplet.jar" >
<PARAM NAME = NAME VALUE = "TestApplet" >
<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
<PARAM NAME="scriptable" VALUE="false">
<COMMENT>
<EMBED type="application/x-java-applet;version=1.3"
CODE = "jcomponent.FileReaderApplet.class" CODEBASE = "."
ARCHIVE = "MyApplet.jar" NAME = "TestApplet" WIDTH = 400
HEIGHT = 300 ALIGN = middle VSPACE = 0 HSPACE = 0 scriptable=false
pluginspage="
plugin-install.html">
<NOEMBED>
</COMMENT>
</NOEMBED>
</EMBED>
</OBJECT>
<!--
<APPLET CODE = "jcomponent.FileReaderApplet.class"
CODEBASE = "." ARCHIVE = "MyApplet.jar" WIDTH = 400 HEIGHT = 300
NAME = "TestApplet" ALIGN = middle VSPACE = 0 HSPACE = 0>
</APPLET>
-->
<!--"END_CONVERTED_APPLET"-->
大家不要看到這裡的寫法很複雜,但是這些都是由HTMLConvert工具自動實作的。
這個工具有指令行和圖形界面兩種運作方式。
好了,現在這個Applet可以運作讀寫檔案的功能了。
如果你要考慮在Internet上實作這個Applet,那麼你也不需要在所有的用戶端均做上面的步驟,
你隻需要在你的伺服器上建立一個目錄,
例如c:/admin,将這個目錄映射為/admin。
這裡的是一個假定的網址,将pepper.cert、pepper.store、
FileReaderApplet.html、MyApplet.jar以及applet.policy放在這個目錄中,
然後修改applet.policy檔案如下:
keystore "",
"JKS";grant signedBy "pepper"{
permission java.io.FilePermission "<<ALL FILES>>", "read";};
3、而每個用戶端僅僅需要修改一下它們的${java.home}/jre/lib/security
目錄下的java.security檔案如下:
policy.url.1=file:${java.home}/lib/security/java.policypolicy.url.2=
file:${user.home}/.java.policypolicy.url.3=
當然每個用戶端還是需要安裝JRE的。
Height Applet在Html頁面上的高度
Name Applet在Html頁面上的名稱,用于區名一個Html頁面上的多個
AppletCode Applet類名,必須帶字尾”class”當沒有屬性archive時,
直接寫類名當有屬性archive時,必須帶包名Codebase Applet的類相對路徑,
相對于Html頁面位置Archive Applet所在Jar包的檔案名
标簽< PARAM>的屬性介紹
屬性 含義
Name Applet傳入的參數名
Value Applet傳入的參數值
當Applet 為一個Class類檔案嵌入的寫法
屬性Code ==========Applet類名,必須帶字尾名
屬性CodeBase ---------------Class類檔案相對于Html頁面的相對 路徑
Applet為一個JAR包,嵌入Html的寫法
屬性Code ==========Applet類名,包括包名
屬性CodeBase ----------------Applet JAR包相對于Html頁面的相對路徑
屬性Archive -----------------------Applet Jar封包件名
五、Applet與js調用
javascript與applet之間能夠互相通訊給我們帶來了很多友善,Java與JavaScript互相補充,
以開發功能更完美的Web應用程式。B/S下能夠充分利用java的優勢,給我們帶來更多的網絡體驗,
友善使用者。我用的比較多的是利用Swing元件開發的應用程式利用applet實作B/s下架構, 這樣能
夠充分顯示Swing元件的優勢,便于系統更新,便于維護;還有就是在WEB下,有時用戶端要使用
本地的硬體資源,我所知道的是通過applet來實作,通過applet去調用javaAPI
(jni,javacomm20-win32)來實作。
不知道有沒有類似applet的實作方式,我想應該有的。
我們具體來看看javascript與applet之間到底是怎樣通訊的呢?
1.JavaScript通路Applet
代碼
1. <applet name="appletName" ....../$amp;>amp;$nbsp;
2. //JavaScript通路Applet屬性
3. window.document.appletName.appletField
(屬性必須是public的,"window.document."也可以不寫)
4. /JavaScript通路Applet方法
5. window.document.appletName.appletMethod
(方法必須是public的,"window.document."也可以不寫)
2.Applet通路JavaScript
Live Connect提供了Java與JavaScript的接口,可以允許在Java Applet小程式中使用JavaScript。
需要用到一個jar包,在C:\WINNT\java\Packages目錄下找,大概有5M多,
其實就是打開看哪個有netscape.javascript.JSObject。如果沒有裝個NetScape或從網上下都可以。
可以把它重命名為netscape.jar(不是必須的),一定要加入到classpath,目的是使開發的時候能夠編譯。
注意:部署時不需要包括netscape.jar,因為整個包會下載下傳到用戶端,影響速度。
代碼
1. //引入netscape類
2. import netscape.javascript.JSObject;
3. import netscape.javascript.JSException; //可允許在小程式中處理異常事件
4.
5. win=JSObject.getWindow(this); // 擷取JavaScript視窗句柄,引用目前文檔視窗
6. doc=(JSObject)win.getMember("document"); // 通路JavaScript document對象
7. form=(JSObject)doc.getMember("textForm"); //通路JavaScript form對象
8. textField=(JSObject)form.getMember("textField");通路JavaScript text對象
9. text=(String) textField.getMember("value"); //擷取文本區的值
10.
11. // 調用JavaScript的alert()方法
12. win.eval("alert(\"This alert comes from Java!\")");
13.
14. // 調用JavaScript的myFunction(message)方法
15. win.call("myFunction", new Object[]{"Hello"});//參數用數組的形勢表示。
注意:你必須在<applet/>标記中加入MAYSCRIPT才能夠調用JSObject對象,
不然會抛出JSException異常。你也不必初始化他們,在什麼地方用就在什麼地方用吧。