天天看點

Java_Applet深入了解

轉自: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異常。你也不必初始化他們,在什麼地方用就在什麼地方用吧。